2011-03-11 2 views

답변

5

슈퍼 구현이 nil을 반환하는 것을 막아줍니다. 슈퍼 클래스가 객체를 초기화 할 수 없다고 판단하면 객체를 초기화하고 nil을 반환 할 수 있습니다. 그러면 nil 포인터를 참조 해제하려고 시도했기 때문에 초기화를 수행하려고하면 프로그램이 중단됩니다.

+0

@ughoavgfhw 어, 나는 프로그램이 중단 될 것이라고 생각하지 않습니다. 당신은 메시지를'nil'에 보낼 수 있습니다. –

+1

@Jacob 예.하지만 초기화 프로그램에서 인스턴스 변수를 변경하려고하면 충돌이 발생합니다. – ughoavgfhw

+0

@ughoavgfhw True. 슈퍼 구현에서 nil을 반환하면 –

1

슈퍼 클래스의 함수가 실패하고 nil을 반환하면 "// STUFF CONFIGURED HERE"코드가 실행되지 않고 함수는 그냥 nil을 반환합니다.

아마도 "// STUFF CONFIGURED HERE"코드가 수퍼 클래스 기능에 의존하여 오류없이 작동하기 때문에 원하는 동작이 될 수 있습니다.

0

super의 초기화 프로그램은 nil뿐만 아니라 self 이외의 객체에 대한 포인터도 반환 할 수 있습니다. 이상하게 보입니다. 그러나 예를 찾기 위해 멀리 보일 필요는 없습니다. 다음을 고려하십시오.

NSString *string1 = @"foo"; 
NSString *string2 = [[NSString alloc] initWithString:string1]; 
NSLog(@"\nstring1 is located at:%p \nstring2 is located at:%p", string1, string2); 

분명히 string1과 string2는 서로 다른 두 개의 객체입니다. 맞습니까? 하나는 상수 문자열이고 다른 하나는 힙의 어딘가에 alloc'ed입니다. 따라서이 코드의 결과를 보는 것이 조금 놀랍습니다.

string1 is located at:0x3044 
string2 is located at:0x3044 

두 포인터가 같은 이유는 무엇입니까? 음, NSString은 변경 불가능합니다. 그들은 변할 수 없으므로 정확히 같은 값을 가진 두 가지 이유가 없습니다. NSString의 -initWithString : 메소드 모양은 다음과 같습니다.

-(NSString*)initWithString:(NSString*)string 
{ 
    if ([string isMemberOfClass:[NSString class]] == YES) { 
     [self release]; 
     self = [string retain]; 
    } 
    else { 
     // set up new immutable copy of string here 
    } 
    return self; 
} 

비정상적인 '[자체 출시]'에 유의하십시오. alloc'ed 이외의 객체를 반환하는 init 메소드는 -release를 자기에게 보내는 것이 의미있는 몇 가지 경우 중 하나입니다.

이니셜 라이저가 다른 개체 또는 nil을 반환하기로 결정할 수도있는 다른 경우가 있으므로 항상 수퍼 이니셜 라이저의 결과를 자체에 할당하는 것이 중요합니다. 반환 된 포인터가 인스턴스 변수에 액세스하기 전에 nil이 아닌지 확인하는 것도 중요합니다. 그 이유는 'if'조건에서 할당이 발생하는 이유입니다.

관련 문제