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

ma1*_*w28 27 null objective-c nsobject respondstoselector

我见过代码如下:

if (delegate != nil && [delegate respondsToSelector:@selector(doSomething)]) ...
Run Code Online (Sandbox Code Playgroud)

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

if ([delegate respondsToSelector:@selector(doSomething)]) ...
Run Code Online (Sandbox Code Playgroud)

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

并且,lessmore.每个Unix专业人员都知道.

Col*_*n S 23

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


Per*_*rcy 5

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