2010-06-03 59 views
0

問題一般來自self = [super init]子類Cocoa意味着在某些情況下沒有子類ivars?

在情況下,如果我繼承NSSomething和我init的方法self = [super init]返回不同的類的對象,這是否意味着我不能有我自己的ivars在我的子類,只是因爲self將指向不同的類?

欣賞如果我的陳述錯誤可以帶來一些例子。

UPD:使我的問題更加精確。

@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對象,因爲它現在NSNumber不供應轉儲信息。所以我失去了對myVeryOwnVar的控制,在更糟糕的情況下可能會出現泄漏和崩潰。

+0

基本上NSNumber的是一個例外,因爲它可以在某些情況下是指向全局實例(如0和可能1在考慮布爾值時很有意義)。我的答案仍然存在。編輯:沒關係,我猜我誤解了這個問題。 – 2010-06-03 12:43:30

回答

1

簡而言之,當調用[super init]時,實際上有一個隱藏參數(self),它是由您的類alloc設置的對象。 ivars已經在那裏,但你沒有明確地通過它們附着的對象(self)。 init不是設置ivars,而是用值初始化它們。

self已經是一個有效的對象指針,當你init被調用和[super init]將在幾乎所有情況下返回,要麼非常相同selfnil

對於更詳細的(也可能是更準確的)描述,參見http://cocoawithlove.com/2009/04/what-does-it-mean-when-you-assign-super.html

+0

我錯過了指定[super init]的情況下返回不同對象的實例的部分。正確的信息應該是「如同任何類集羣一樣,如果您創建NSNumber的子類,則必須覆蓋其超類NSValue的原始方法。」但恐怕這有點超出我解釋的範圍。 – 2010-06-03 12:56:33

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 2010-06-03 12:20:44

+0

@Joonas Trussmann,@invariant:更新了原始帖子。 – Pablo 2010-06-03 12:40:18

+0

@JeremyP我編輯了答案,表明它可能也是一個子類 – 2010-06-03 13:35:30

相關問題