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'조건에서 할당이 발생하는 이유입니다.
@ughoavgfhw 어, 나는 프로그램이 중단 될 것이라고 생각하지 않습니다. 당신은 메시지를'nil'에 보낼 수 있습니다. –
@Jacob 예.하지만 초기화 프로그램에서 인스턴스 변수를 변경하려고하면 충돌이 발생합니다. – ughoavgfhw
@ughoavgfhw True. 슈퍼 구현에서 nil을 반환하면 –