Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在某些情况下,Cocoa子类化意味着没有IVAR子类?_Objective C - Fatal编程技术网

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的基本方法。”但我恐怕无法解释这一点。