4

我正在查看一些代码并遇到了一些看起来像这样的东西(假设它是为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]

在初始化开始时是真的,在我分配它之前?

4

2 回答 2

11

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

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

于 2013-04-03T20:49:08.580 回答
0

self指针由建立alloc。成语

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

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

于 2013-04-03T20:50:30.320 回答