【问题标题】:Cocoa Objective-C init oddityCocoa Objective-C 初始化异常
【发布时间】:2013-03-25 17:36:24
【问题描述】:

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

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

【问题讨论】:

    标签: objective-c cocoa constructor initializer


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的链接,非常有用。我很惊讶 Apple 没有在他们的介绍性文档中详细说明这一点。
    【解决方案2】:

    self 指针由alloc 建立。成语

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      相关资源
      最近更新 更多