Cocoa Objective-C初始奇怪

时间:2013-04-03 20:45:04

标签: objective-c cocoa constructor initializer

我正在审核一些代码并遇到了类似这样的内容(假设它是为TestObject类定义的)

-(id) init
{
    if (self == [super init])
    {
        self.testString = @"Hello";
    }
    return self;
}

我立即改变了

if (self == [super init])

if (self = [super init])

但后来意识到(虽然我知道它不对)代码工作原理,我在一个超简单的程序中隔离了原始代码

    TestObject* testObject = [[TestObject alloc] init];
    NSLog(@"%@", testObject.testString);

令我惊讶的是,这很有效。为什么等式检查而不是赋值不会破坏事物?为什么

self == [super init]
在我开始分配之前,

在init开始时是真的吗?

2 个答案:

答案 0 :(得分:11)

self已经为您分配。将其分配给[super init]的目的是允许超类的-init实现返回不同的对象。我强烈推荐The How and Why of Cocoa Initializers(Mike Ash)和self = [stupid init];(Wil Shipley)更详细地讨论为什么这是(或不是)一个好主意。关于是否需要检查相等性(==),您会发现不同的意见。

顺便说一句,如果您尝试使用任何其他方法分配给self,则会看到以下错误消息:

答案 1 :(得分:0)

self指针由alloc建立。成语

if(self = [super init])
{
...
}

是为了防止超类'init需要更改值的情况。例如,某些init可能会通过返回nil来表示失败。