【发布时间】:2010-07-24 00:20:09
【问题描述】:
我在 XCode 生成的示例和存根中看到很多这样的代码:
if ((self = [super init])) {
}
我不清楚条件中双括号的意图。
【问题讨论】:
标签: objective-c
我在 XCode 生成的示例和存根中看到很多这样的代码:
if ((self = [super init])) {
}
我不清楚条件中双括号的意图。
【问题讨论】:
标签: objective-c
为了扩展@Anders 评论,它保护您免受的具体问题如下:
if (foo = x) { do_something() };
90% 的时间这是一个错误。你的意思是说foo == x。但是有 10% 的情况下,您的真正意思是“将 x 分配给 foo,然后测试是否为真”。典型的例子是while (ch = getchar())。但是if (self = [super init]) 是另一个很好的例子。编译器假定这些事情是错误的并抛出警告,除非你用双括号告诉编译器你的意思是真的。
就我个人而言,我就是这样做的:
self = [super init];
if (self != nil)
{
...
}
return self;
这是一个额外的行,但是当 init 调用很长时,它会让事情变得更清晰。
顺便说一句,Big Nerd Ranch 出名的 Aaron Hillegas 向我们中的几个人提出了挑战,让我们想出任何这种self==nil 检查实际上很重要的案例。这些案例存在,但数量极少(您可以将self 添加为NSObservation 观察者,在这种情况下您不希望它是nil)。把它当作它的价值;在我的个人代码中,我经常跳过nil 检查,但在我的专业代码中,这是我团队标准的一部分。
另外,出于某种原因,Apple 添加了一个额外的 gcc 选项 -Wmost 以关闭此警告。我猜有人不喜欢输入额外的括号。关闭它对我来说似乎是个坏主意。
【讨论】:
只是为了避免收到警告。
【讨论】: