示例代码中的双括号

ite*_*ter 8 objective-c

我在XCode生成的示例和存根中看到了很多这样的代码:

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

我不清楚条件中双括号的意图.

Rob*_*ier 7

要扩展@Anders评论,它保护您的特定问题是这样的:

if (foo = x) { do_something() };
Run Code Online (Sandbox Code Playgroud)

90%的时间这是一个错误.你想说foo == x.但是,有10%的时间,你真的意味着"将x分配给foo然后测试真相." 这是典型的案例while (ch = getchar()).但这if (self = [super init])是另一个很好的例子.编译器假定这样的事情是错误并抛出警告,除非你通过使用双括号告诉编译器你真正的意思.

就个人而言,我只是这样做:

self = [super init];
if (self != nil)
{
  ...
}
return self;
Run Code Online (Sandbox Code Playgroud)

这是一个额外的行,但是当init调用很长时它会使事情变得更加清晰.

顺便说一句,Big Nerd Ranch成名的Aaron Hillegass向我们中的几个人提出挑战,想出任何一个这个self==nil检查确实很重要的案例.这些案例存在,但它们非常少(您可能会添加self为NSObservation观察者,nil在这种情况下您不希望它).把它拿走它的价值; 在我的个人代码中,我经常跳过nil支票,但在我的专业代码中,这是我团队标准的一部分.

另外,出于某种原因,Apple添加了一个额外的gcc选项-Wmost,可以关闭此警告.我想有人不喜欢打字额外的括号.把它关掉似乎是一个坏主意.