2010-06-03 60 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

相关问题