2014-07-12 4 views
-2

이것은 기본적인 Objective-C 질문이지만 신비화되어 있으며 다른 곳에서 답변을 찾지 못했습니다. MyObject를 호출 할 사용자 정의 클래스가 있습니다. 내 MainMenu.xib에는 해당 사용자 정의 클래스 내에서 IBAction을 트리거하는 버튼이 있습니다. 동일한 NIB 파일에서 클래스 MyObject의 개체 (파란색 큐브)가 있으므로 사용자 지정 클래스 내의 메서드 (IBAction)에 단추를 "연결"할 수 있습니다. 이 모든 것이 잘 작동합니다.IBAction에서 "self"는 객체의 첫 번째 인스턴스만을 나타냅니다.

MyObject의 인스턴스를 여러 개 만들 필요가 있습니다. 그 중 일부는 클래스 내에서 간단한 (void) 메소드이고 그 중 몇 개는 클래스에있는 IBActions에있는 몇 가지 메소드가 있습니다. MainMenu.xib 파일.

IBActions가 아닌 (void) 로컬 메소드에서 "self"를 사용할 때, 원하는대로 클래스의 현재 활성 인스턴스를 항상 참조합니다. IBActions에서 "self"를 사용할 때는 항상 해당 사용자 정의 객체의 첫 번째 인스턴스 만 나타냅니다.

나는 현재 활성 인스턴스를 MyObject에 대한 포인터로 추적하여이 문제를 쉽게 해결할 수 있지만 일부 방법에서는 "self"가 예상대로 작동하지만 IBActions에서는 그렇지 않은 이유를 알고 싶습니다. 그들 모두가 하나의 클래스 파일에 있다고 생각했습니다.

다음 코드가 무슨 뜻인지 설명하기위한 것입니다 (나는 그것이 작동하는 희망!) :

@implementation MyObject 

MyObject *theActiveObject; 

- (instancetype) init { 
    self = [super init]; 
    if (self) 
     theActiveObject = self; 
    return self; 
    } 

- (IBAction)showSelf:(id)sender { 
    NSLog(@"from an IBAction, my SELF is: %p theActiveObject: %p", self, theActiveObject); 
    [self showSelfOther]; 
    } 

- (void) showSelfOther { 
    NSLog(@"from a plain method: SELF is: %p theActiveObject: %p", self, theActiveObject); 
    } 

내가 여러 활성 개체의 첫 번째 개체를 한 경우 (그 창을 클릭하여, 예를 들어) 다음, 나는 (시뮬레이션 주소를 사용하여) 얻는 결과는 다음과 같습니다 IBAction를에서

, 내 SELF는 다음과 같습니다 0xaddress01 theActiveObject : 일반 방법에서 0xaddress01

: SELF는 다음과 같습니다 0xaddress01 theActiveObject : 0xaddress01

그때 내 사용자 정의 클래스의 두 번째 개체의 창에 클릭하면, 내가 할 일 : IBAction를에서

, 내 SELF는 다음과 같습니다 0xaddress01 theActiveObject : 0xaddress02

평범한 방법에서

: SELF은 다음과 같습니다 0xaddress02 theActiveObject : IBAction를에서 두 번째 객체에서 사용되는 "자기", 첫 번째 O를 가리키는 이유 0xaddress02

나는 보지 않는다 피하십시오. 이것을 이해하는데 도움이 될 것입니다.

덕분에,이 답변이 명확하고 의미가 있습니다 :

댓글 켄 Thomases (감사, 켄)의 응답에 대한 응답에 추가되었습니다. 앞에서 말한 것처럼 별도로 유지 관리되는 변수 (또는 배열)를 사용하여 MyObject의 각 인스턴스를 유지함으로써이 문제를 쉽게 해결할 수 있습니다. 어쨌든해야합니다. 그래서 내 질문은 이론이된다 : 이것을 "올바른"방법인가? MainMenu.xib (사용자 인터페이스에 있어야 함)에 사용자 정의 클래스의 메서드에 연결된 두 개의 버튼이 있습니다. 나는 MainMenu.xib의 커스텀 클래스를 나타내는 "blue cube"객체로만이 방법으로 연결할 수 있으며, 그 메소드 내에서는 "self"를 사용할 수 없다. 이것은 클래스의 다른 모든 메소드에서 "self"를 사용하기 때문에 잘못되었다고 생각합니다. 예상대로 작동합니다.이 메소드는 각 인스턴스마다 변경됩니다.

올바른 접근 방식입니까, 아니면 사용자 지정 클래스의 모든 메서드에서 "self"를 사용할 수 있도록 다른 전략을 사용해야합니까? 그렇다면 해당 전략은 무엇입니까?

커스텀 클래스의 첫 번째 인스턴스는 시작시 MainMenu.xib가로드 될 때 생성된다는 것을 알았습니다. 왜냐하면 그 파일에 "Blue Cube"가 있기 때문입니다. 나는 버튼을 사용하지 않고 커스텀 클래스의 메소드에 버튼을 연결하는 다른 방법을 모른다는 이유로 나는 파란색 큐브를 가지고있다. 내가 알아 내지 못한 것을 할 수있는 방법이 있습니까? 그렇다면 파란색 큐브를 제거하여 처음으로 자동으로 만들어진 사용자 지정 개체의 인스턴스를 제거 할 것으로 기대합니다. 따라서 맞춤 클래스의 모든 메서드에서 동일한 방식으로 자체를 사용할 수 있습니다.

이 주제에 관해 알려줄 수있는 모든 표시등은 대단히 감사하겠습니다. 다른 한편으로는, 나는 왜 나의 원래 질문에 두 번의 투표가 내려 졌는지 이해하지 못한다. 너무 멍청 해?

+7

'self'는 항상 메소드가 호출 된 인스턴스를 나타내며 결코 다른 것을 참조하지 않습니다. – nhgrif

답변

0

항상 동일한 인스턴스를 나타내는 것은 아닙니다. 앱의 컨트롤에 이전과 동일한 목표가 여전히 있기 때문에 여기에서 수행됩니다.

1

MainMenu.xib에는 앱 기본 메뉴의 보관 파일이 들어 있습니다. NIB는 앱 시작시로드되며 그 안에있는 메뉴는 보관되지 않고 런타임시 실제 메인 메뉴로 설치됩니다.

분명히 말하자면, 당신은 또한 NIB에서 MyObject 클래스의 인스턴스를 인스턴스화했습니다. 이 인스턴스는 NIB 내에 보관됩니다. NIB가로드되면 해당 인스턴스는 보관되지 않고 앱 프로세스 내에서 "라이브 개체"가됩니다.

해당 개체에 대해 NIB 내에 설정 한 모든 연결이 해당 인스턴스에 만들어집니다. 특히, 버튼의 타겟을 그 인스턴스에 직접 연결 한 것 같습니다. 이러한 연결은 고정되어 있습니다. 이 단추는 해당 인스턴스를 대상으로하며 다른 인스턴스는 대상으로하지 않습니다.

따라서 단추를 누르면 (고정 된) 대상의 동작 방법이 호출됩니다.

대조적으로 코드에서 메소드를 호출 할 때 수신기를 지정하면 원하는만큼 동적이 될 수 있습니다. 그것이 당신의 코드의 논리가하는 것이면 다른 메시지로 보낼 수 있습니다.

버튼이 NIB의 첫 번째 응답자를 타겟팅하는 것처럼 들리는 것 같습니다. 그것은 어떤 뷰에서부터 시작하여 포커스가 포함 된 창까지 그리고 그 다음 앱으로 시작하는 객체 체인을위한 자리 표시 자이므로 포커스가 변경됨에 따라 변경됩니다. 그러나 세부 사항없이 원하는 것이 맞는지 확인하기는 어렵습니다.