2012-11-01 3 views
-2

가능한 중복 :
In Objective-C why should I check if self = [super init] is not nil?재정 초기화

나는 오브-C에 새로 온 사람, 반환 값이 테스트로 nil이 아닌이 왜 힘든 시간을 이해하는 데 "if 문".

- (id)init 
{ 
    self = [super init]; 
    if (self) { 
     // Initialization code here. 
    } 

    return self; 
} 

이 메서드는 부모 이니셜 라이저를 먼저 호출합니다. 부모의 이니셜 라이저를 실행하면 상속 된 인스턴스 변수가 제대로 초기화됩니다. 이니셜 라이저는 메모리에있는 객체의 위치를 ​​변경할 권한이 있으므로 (참조가 변경됨을 의미) 부모의 init 메소드 실행 결과를 다시 self에 할당해야합니다. 부모의 초기화가 성공하면 반환되는 값은 if 문에 의해 테스트 된대로 nil이 아닌 값이됩니다. 주석에서 알 수 있듯이, 뒤 따르는 블록 안에는 개체에 대한 사용자 지정 초기화 코드를 넣을 수있는 위치가 있습니다. 여기에는 종종 클래스에있는 인스턴스 변수를 할당하고 초기화하는 작업이 포함됩니다.

에서 스티븐 Kochan에서 코드 및 텍스트 "목표 - C에서 프로그래밍, 제 4 판"

+0

나는 솔직해질 것입니다. 나는 결코 그것에 대해서 생각조차하지 않았습니다.그러나 'super init'을 호출하면 슈퍼 클래스 (NSObject)의 init 메소드가 호출됩니다. 거기에 할당 된 메모리의 위치를 ​​결정하고 몇 가지 예비 초기화를 수행합니다. 나는 그것이 '자기'를 되돌려 줄 필요가 있다고 추측합니다. 왜냐하면 우리는 매개 변수를 그와 같은 사슬에서 '전달'할 수 있기 때문입니다. 그러나 나는 분명히 확실하지 않다. – ATaylor

+0

[super init]이 nil이 아닌 값을 반환하는 이유를 묻는 경우 또는 반환 된 값이 nil이 아닌지 확인하는 이유를 묻는 중입니까? – yfrancis

+0

꺼짐 : @yfrancis 안녕하세요! –

답변

2

다음과 같은 경우를 생각해 볼 수 붙여, 우리가 Parent 전화 할게 부모 클래스를 가지고, 다음과 같은 레이아웃이 그 :

@implementation Parent { 
    int value; 
} 

하고 Parent의 서브 클래스이며, 다음과 같은 레이아웃이 클래스 Child 가지고 :

@implementation Child { 
    int other; 
} 
Child 서브 클래스 내에서

(3210), 당신은 Parent 바르에 직접 액세스가 value를 호출되지 있습니다. 그러나 초기화에 Parentvalue에 약간의 정수를 할당하고, Parent의 일부 기능이 값이 설정되는에 따라 달라집니다.

Child[super init], value를 호출하지 않는 경우

초기화하지 않고 Child 상속이 깨진 것 Parent의 기능의 일부 않을 것입니다. init 메서드는 초기화 된 개체 인스턴스에 대한 포인터를 반환하도록 정의됩니다. [super init]의 반환 값을 무시하면 부모 init이 할당 자에 의해 제공된 위치가 아닌 다른 위치에 객체 인스턴스를 재 할당하기로 결정했을 수 있으므로 문제가 발생할 수 있습니다.

예, NSString can detect initialization with empty string literals를 들어

하고 힙에 일정한는 NSString 참조 대신 중 하나에 대한 포인터를 반환합니다. 그래서 그냥 [super init]를 호출하고 반환 값을 무시하고, 갑자기 매달려 포인터를 사용하고있는 Childinit 메서드에 전달 된 self 포인터 값을 계속 사용 말한다!

이것은 극단적 인 경우이지만, 당신이 의도 부모 클래스에서 기능을 상속 할 경우 요점은 당신이 [super init]에 자기를 할당해야하고,이 nil를 반환하는 경우 초기화가 실패하기로 결정했습니다 수 있기 때문에 당신은 확인해야하고,이다 할당 자에 의해 제공된 메모리를 파괴하십시오.

+0

감사! 이것은 나를 위해 그것을 분명히합니다. 지금은 모두 분명 해지고 있습니다. –