问题通常来自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的控制权,在更糟糕的情况下可能会发生泄漏和崩溃。
答案 0 :(得分:1)
self = [super init]
不会返回不同类的对象,尽管它可以返回与调用实例不同的类的实例。
但是,它将始终属于NSSomething类或NSSomething的子类,并且您始终可以拥有自己的实例变量。
答案 1 :(得分:1)
简而言之,当调用[super init]
时,实际上存在一个隐藏参数(self
),这是您的类alloc
设置的对象。 ivars已经存在,但是你没有明确地传递它们所附着的对象(self
)。 init
不设置ivars,而是使用值初始化它们。
self
被调用时, init
已经是有效的对象指针,而[super init]
几乎在所有情况下都会返回相同的self
或nil
有关更详细(可能更准确)的说明,请参阅http://cocoawithlove.com/2009/04/what-does-it-mean-when-you-assign-super.html