我见过代码:
if (delegate != nil && [delegate respondsToSelector:@selector(doSomething)]) ...
但是,向nil
发送消息只会返回nil
(评估为NO
),所以为什么不这样做:
if ([delegate respondsToSelector:@selector(doSomething)]) ...
如果delegate == nil
,前者会更快吗?无论哪种方式,我更喜欢后者,因为它的代码更少。
而且,less
优于more
。每个Unix专业人员都知道。
答案 0 :(得分:23)
objc_msgSend,用于在Objective-C中发送动态消息的函数立即检查第一个参数(消息接收者)并返回if == nil。因此,nil消息传递的唯一开销是动态链接库函数调用,这比“内部二进制”函数调用稍微昂贵一些。总的来说,一种方法比另一种更有效吗?复合条件语句通常需要额外的分支,因此答案是不确定的,无需查看编译器生成的代码,但更重要的是分析正在运行的程序。过早优化是一件坏事™,但我祝贺你真正考虑效率并质疑这类“成语”。
答案 1 :(得分:5)
你是对的。这在Obj-C中是技术上不必要的开销,因为发送到nil
的任何消息都将自动返回nil
。但是,如果您首先检查respondsToSelector:
是否nil
,则忽略对respondsToSelector:
的调用,那么您将跳过{{1}}调用的开销。所以它会更快,但多少,我不确定。
答案 2 :(得分:-3)
这里有一个语法问题 - 如果您将-respondsToSelector发送到nil对象,它将始终返回nil。这就是你做这件事的原因。