objective-c - 示例代码中的双括号

标签 objective-c

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

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

我不清楚条件语句中双括号的用意。

最佳答案

为了扩展@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 Hillegass 向我们中的一些人发出了挑战,要求他们想出这种 self==nil 检查实际上很重要的任何情况。这种情况是存在的,但它们非常少(您可以将 self 添加为 NSObservation 观察者,并且您不希望它是 nil那种情况)。物有所值地接受它;在我的个人代码中,我经常跳过 nil 检查,但在我的专业代码中,它是我团队标准的一部分。

另一方面,出于某种原因,Apple 添加了一个额外的 gcc 选项 -Wmost 来关闭此警告。我猜那里有人不喜欢输入额外的括号。关闭它对我来说似乎是个坏主意。

关于objective-c - 示例代码中的双括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3323257/

相关文章:

objective-c - 更新后的 XCode 6.3 代码签名问题

ios - 如何将空值传递给数组?

objective-c - iOS:NSMutableArray 为空

ios - 双击识别器不适用于 NSTimer 运行

ios - 缩放 CALayer 内容的大小

ios - 将实时摄像机视频从 iOS (iPhone/iPad) 流式传输到远程 PC/服务器

iphone - 警告 : check_safe_call: could not restore current frame

ios - 在 UIWebView iOS 8 中呈现 PDF,导致 PDF 周围出现黑色边框

objective-c - 如何在沙盒应用程序中获取用户主目录?

objective-c - Dictionary<String, Any> 与 [String : Any]