子类化Cocoa在某些情况下意味着没有子类ivars?

时间:2010-06-03 10:49:42

标签: objective-c

问题通常来自self = [super init]

如果我是子类化NSSomething并且在我的init的方法中self = [super init]返回不同类的对象,这是否意味着我无法在我的子类中拥有我自己的ivars,只是因为{{1}会指向不同的班级吗?

如果我的陈述是错误的,你可以提出一些例子。

UPD:让我的问题更精确。

self

这显然在向@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的控制权,在更糟糕的情况下可能会发生泄漏和崩溃。

2 个答案:

答案 0 :(得分:1)

self = [super init]不会返回不同类的对象,尽管它可以返回与调用实例不同的类的实例。 但是,它将始终属于NSSomething类或NSSomething的子类,并且您始终可以拥有自己的实例变量。

答案 1 :(得分: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