Cocoa Objective-C初始奇怪

jba*_*100 4 cocoa constructor objective-c initializer

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

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

我立刻改变了

if (self == [super init])
Run Code Online (Sandbox Code Playgroud)

if (self = [super init])
Run Code Online (Sandbox Code Playgroud)

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

    TestObject* testObject = [[TestObject alloc] init];
    NSLog(@"%@", testObject.testString);
Run Code Online (Sandbox Code Playgroud)

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

self == [super init]
Run Code Online (Sandbox Code Playgroud)

在我开始之前,在我分配它之前是真的吗?

jtb*_*des 11

self已经为您分配.分配它的目的[super init]是允许超类的-init实现返回不同的对象.我强烈推荐Cocoa Initializers的方法和原因(Mike Ash)和self = [stupid init]; (Wil Shipley)更详细地讨论为什么这是(或不是)一个好主意.关于是否需要检查equality(==),您会发现不同的意见.

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