Objective c 在目标c中向nil对象发送消息是否有缺点? 我是一个长时间的C++程序员,在C语言中有很长的时间。然而,我现在在目标C中工作,我想知道,在目标C中向一个nil对象发送消息是否有缺点

Objective c 在目标c中向nil对象发送消息是否有缺点? 我是一个长时间的C++程序员,在C语言中有很长的时间。然而,我现在在目标C中工作,我想知道,在目标C中向一个nil对象发送消息是否有缺点,objective-c,Objective C,例如,我非常习惯这样做: MyClass* c = NULL; // ... if( c != NULL ) c->MyMethod(); 因此,在目标C中,我发现自己在做: MyClass* c = nil; // ... if( c != nil ) [c MyMethod]; 所以我想知道的是,检查零有什么好处吗?如果我尝试向nil发送消息,Objective C是否足够聪明,不会进行任何额外的奇怪处理?还是有一些隐藏的成本值得继续检查零?没有。这就是Objective-C的美妙

例如,我非常习惯这样做:

MyClass* c = NULL;
// ...
if( c != NULL ) c->MyMethod();
因此,在目标C中,我发现自己在做:

MyClass* c = nil;
// ...
if( c != nil ) [c MyMethod];

所以我想知道的是,检查零有什么好处吗?如果我尝试向nil发送消息,Objective C是否足够聪明,不会进行任何额外的奇怪处理?还是有一些隐藏的成本值得继续检查零?

没有。这就是Objective-C的美妙之处。

在Objective-C中,您不需要检查nil,如果返回值是整数,则发送nil-valid消息是完全有效的,并且大多数情况下将返回nil或0。如果要传递的消息的返回值是float、double或struct,则返回值是未定义的。

只要返回值在该上下文中表示为full,则消息传递nil就没有问题。在某些情况下,调试可能会变得复杂

“如果该方法返回任何指针类型、大小小于或等于sizeof(void*)的任何整数标量、浮点、双精度、长双精度或长-长,则发送到nil的消息返回0”(下面的Apple链接)
--(正在向nil发送消息)

只需注意使用返回值的情况。消息传递
nil
也是高度优化的(当启用GC时发送
-retain
-release
),因此在大多数情况下,它甚至不是性能问题。