Objective c 在某些情况下,Cocoa子类化意味着没有IVAR子类?
问题通常来自于Objective c 在某些情况下,Cocoa子类化意味着没有IVAR子类?,objective-c,Objective C,问题通常来自于self=[super init] 如果我是NSSomething的子类,并且在我的init方法中self=[super init]返回不同类的对象,这是否意味着我不能在我的子类中拥有自己的IVAR,仅仅因为self将指向不同的类 如果我的陈述是错误的,如果你能举出一些例子,我将不胜感激 UPD:让我的问题更精确 @implementation Base -(id) init { return [NSNumber numberWithBool:YES]; } @end @
self=[super init]
如果我是NSSomething的子类,并且在我的init方法中self=[super init]
返回不同类的对象,这是否意味着我不能在我的子类中拥有自己的IVAR,仅仅因为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的控制,在更糟糕的情况下可能会出现泄漏和崩溃。self=[super init]不会返回不同类的对象,尽管它可以返回与调用实例不同的类的实例。
但是,它总是属于NSSomething类或NSSomething的子类,并且您总是能够拥有自己的实例变量。简而言之,当调用
[super init]
时,实际上有一个隐藏参数(self
),它是您的类alloc
设置的对象。ivar已经存在,但是您传递它们所附加到的对象(self
),而不显式地这样做init
不设置IVAR,而是使用值初始化IVAR
调用init
时,self
已经是一个有效的对象指针,[super init]
几乎在所有情况下都会返回相同的self
或nil
有关更详细(可能更准确)的描述,请参见Class cluster init methods不一定返回超类@JeremyP的实例。我编辑了答案,以表明它可能是子类。因为在某些情况下,它可能是指向全局实例的指针,所以编号是该规则的一个例外(例如对于0和可能是1,这在考虑布尔值时非常有意义)。我的答案仍然有效。编辑:没关系,我想我只是稍微误读了这个问题。我有点错过了您指定的[super init]返回不同对象实例的部分。正确的信息应该是“与任何类集群一样,如果创建NSNumber的子类,则必须重写其超类NSValue的基本方法。”但我恐怕无法解释这一点。