Objective-C:为什么在respondsToSelector之前检查nil:?

时间:2011-06-25 17:06:44

标签: objective-c null nsobject respondstoselector

我见过代码:

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

但是,向nil发送消息只会返回nil(评估为NO),所以为什么不这样做:

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

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

而且,less优于more。每个Unix专业人员都知道。

3 个答案:

答案 0 :(得分:23)

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

答案 1 :(得分:5)

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

答案 2 :(得分:-3)

这里有一个语法问题 - 如果您将-respondsToSelector发送到nil对象,它将始终返回nil。这就是你做这件事的原因。