29

我见过这样的代码:

if (delegate != nil && [delegate respondsToSelector:@selector(doSomething)]) ...

但是,发送一条消息nil只返回nil(计算结果为NO),那么为什么不这样做:

if ([delegate respondsToSelector:@selector(doSomething)]) ...

如果 ,前者更快delegate == nil吗?无论哪种方式,我更喜欢后者,因为它的代码更少。

并且,less优于more. 每个 Unix 专业人士都知道这一点。

4

3 回答 3

24

objc_msgSend,用于在 Objective-C 中发送动态消息的函数会立即检查第一个参数(消息接收者)并在它 == nil 时返回。因此,nil 消息传递的唯一开销是动态链接库函数调用,这比“内部二进制”函数调用的成本略高。总的来说,一种方法比另一种更有效吗?复合条件语句通常需要额外的分支,因此如果不查看编译器生成的代码,则无法确定答案,更重要的是分析正在运行的程序。过早的优化是一件坏事™,但我祝贺您真正考虑效率并质疑诸如此类的“成语”。

于 2011-06-25T17:24:28.617 回答
5

你是对的。这在 Obj-C 中技术上是不必要的开销,因为发送到的任何消息nil都会自动返回nil。但是,如果您respondsToSelector:通过首先检查是否为 来忽略调用nil,那么您将跳过respondsToSelector:调用的开销。所以它会更快,但多少,我不确定。

于 2011-06-25T17:13:11.310 回答
-3

这里有一个语法问题——如果你将 -respondsToSelector 发送给一个 nil 对象,它总是会返回 nil。这就是为什么你会做这样的事情。

于 2012-03-12T06:06:49.843 回答