【问题标题】:Why does ((self=[super init]]) work, but (!(self=[super init])) doesn't?为什么 ((self=[super init]]) 有效,但 (!(self=[super init])) 无效?
【发布时间】:2011-05-07 12:55:47
【问题描述】:

出于审美原因,我决定更改此设置:

if ((self = [super init])) {
    // init self
}
return self;

进入这个:

if (!(self = [super init])) return nil;
// init self
return self;

理论上,他们做同样的事情。第一个是经典方式,简单有效。调试第二个,我发现它几乎可以工作。 "if" 正确,init 代码也正确,但是,返回 "self" 后,调试器返回 "if" 并返回 nil!

我使用第二个类创建的所有类都将恢复为使用“正确”方式,因为它们使用 nil 进行初始化,但我真的很想知道它为什么会这样!恐怕这可能是其他错误的结果!

【问题讨论】:

  • 如果在 Xcode 4 中发生这种情况,那么原因是调试器只是在 ObjC 方法中很糟糕并疯狂地跳来跳去。
  • 这不是仅调试器的行为。它确实将“nil”返回给调用者。哦,初始化代码被调用了(包括我放在那里的一些“NSLog”。
  • @Eduardo Costa:好吧,那就别管我的评论了。
  • 请提供重现问题的最小测试用例。
  • @Nick / @Josh:事实上,将作业移出 if() 似乎是 Apple 现在的首选方式。

标签: objective-c xcode ios


【解决方案1】:

除了审美偏好之外,您的两个版本之间绝对没有区别,所以肯定有其他问题。也许您应该发布您的整个 init 方法?

【讨论】:

  • 这个类是一个有很多相互依赖的树节点。我需要发布我的整个项目以使其有用。但我相信发生了某种缓冲区溢出,因为我无法在简单的测试中重现它。顺便说一句,它没有解释为什么外部错误使我的 init 代码运行然后返回 nil!
  • @Eduardo 如果您不提供更多信息,那么有人不太可能猜到您的代码出了什么问题。
  • @Bavarious 是的,我知道。正如我所说,我猜发生了一些缓冲区溢出 - 没有解释“nil return”,但我使用这种技术创建了新类并且它按预期工作。我将此答案标记为“正确”,因为我会假设“肯定有其他问题”。
【解决方案2】:

我为此创建了一个测试类,使用以下 init 方法:

- (id)init
{
    if (!(self = [super init])) return nil;
    [self setText:@"foo"];
    return self;
}

它按预期初始化,我可以访问 text 属性。所以正如尼克指出的那样,肯定是其他东西出了问题。

【讨论】:

    猜你喜欢
    • 2011-03-04
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    • 2012-11-22
    • 1970-01-01
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多