2010-06-03 4 views
0

질문은 일반적으로 self = [super init]에서옵니다. 경우서브 클래 싱 코코아는 어떤 경우 하위 클래스 ivars를 의미하지 않습니까?

내가 다른 클래스의 객체를 반환 self = [super init] NSSomething 내 초기화의 방법을 서브 클래스하고있어 경우, 내가 self이 다른 클래스를 가리키는 것해서, 내 서브 클래스 내 자신의 인스턴스 변수를 가질 수 없습니다입니다 의미 하는가 ?

내 진술이 잘못되었을 때 몇 가지 예를 들려 주시면 감사하겠습니다.

UPD : 내 질문을 정확하게 작성하십시오. 지금 NSNumber 그리고 덤프 메시지를 제공하지 않기 때문에

@implementation Base 
-(id) init 
{ 
    return [NSNumber numberWithBool:YES]; 
} 
@end 

@interface Child : Base 
{ 
int myVeryOwnVar; 
} 
- (id) init; 
- (void) dump; 
@end 
@implementation Child 
- (id) init 
{ 
self = [super init]; 
myVeryOwnVar = 5; 

return self; 
} 
@end 

Child *p = [[Child alloc] init]; 
[p dump]; 

이 분명히 p 객체에 메시지를 보내는에 추락했다. 그래서 나는 myVeryOwnVar에 대한 제어권을 잃었고, 더 나쁜 경우에는 누수와 충돌을 일으킬 수 있습니다.

+0

은 기본적으로의 NSNumber 규칙에 대한 예외입니다 참조 1은 부울을 고려할 때 많은 의미를 가짐). 내 대답은 아직도있다. 편집 : 신경 쓰지 마세요. 나는 약간의 질문 만 잘못 읽은 것 같습니다. –

답변

1

간단히 말해서 [super init]이 호출 될 때 실제로 거기에는 숨겨진 매개 변수 (self)가 있습니다. 이는 alloc 클래스에 의해 설정된 개체입니다. ivars는 이미 있지만, 명시 적으로 지정하지 않고 첨부 된 객체 (self)를 전달합니다. init이 아니므로 값으로 초기화합니다.

selfinit가 호출되는 및 [super init]은 거의 모든 경우 중 하나를 반환 할 때 이미 유효한 오브젝트 포인터 바로 그 같은 self 또는 nil. 이 경우에 따라 (예 : 아마도 0에 관해서는 전역 인스턴스에 대한 포인터가 될 수 있기 때문에 더 자세한 (아마도 훨씬 더 정확)에 대한 설명

, http://cocoawithlove.com/2009/04/what-does-it-mean-when-you-assign-super.html

+0

다른 객체의 인스턴스를 반환하는 [super init]의 경우를 지정했던 부분을 놓쳤습니다. 올바른 정보는 "어떤 클래스 클러스터와 마찬가지로 NSNumber의 하위 클래스를 만들면 상위 클래스의 원시 메서드 인 NSValue를 재정의해야합니다." 그러나 이것은 내가 설명 할 수없는 것보다 약간 두렵다. –

1

self = [super init]은 호출 인스턴스와 다른 클래스의 인스턴스을 반환 할 수 있지만 다른 클래스의 개체를 반환하지 않습니다. 그러나 항상은 NSSomething 클래스이거나 NSSomething의 하위 클래스 일 수 있으며 항상 사용자 인스턴스 변수를 가질 수 있습니다.

+2

클래스 클러스터 초기화 메소드가 반드시 수퍼 클래스의 인스턴스를 반환하지는 않습니다. http://developer.apple.com/mac/library/documentation/cocoa/reference/Foundation/Classes/NSString_Class/Reference/NSString.html#//apple_ref/doc/uid/20000154-397865 – JeremyP

+0

@ Joonas Trussmann, @invariant : 업데이트 된 원본 게시물. – Pablo

+0

@JeremyP 서브 클래스가 될 수도 있다는 답변을 편집했습니다. –