现在的位置: 首页 > 综合 > 正文

[Objective-C]向nil发送消息

2013年10月10日 ⁄ 综合 ⁄ 共 936字 ⁄ 字号 评论关闭

    向nil发送消息

    在Objective-C中向nil发送消息是完全有效的——只是在运行时不会有任何作用。Cocoa中的几种模式就利用到了这一点。发向nil的消息的返回值也可以是有效的:
    • 如果一个方法返回值是一个对象,那么发送给nil的消息将返回0(nil)。例如:Person * motherInlaw = [ aPerson spouse] mother]; 如果spouse对象为nil,那么发送给nil的消息mother也将返回nil。
    • 如果方法返回值为指针类型,其指针大小为小于或者等于sizeof(void*),float,double,long double 或者long long的整型标量,发送给nil的消息将返回0。
    • 如果方法返回值为结构体,正如在《Mac OS X ABI 函数调用指南》,发送给nil的消息将返回0。结构体中各个字段的值将都是0。其他的结构体数据类型将不是用0填充的。
    • 如果方法的返回值不是上述提到的几种情况,那么发送给nil的消息的返回值将是未定义的。
    下面的代码段就是一个有效地向nil发送消息的示例:

  1. id anObjectMybeNil = nil;  
  2. //这种写法是有效的  
  3. if ( [ anObjectMaybeNil methordThatReturnADouble] == 0.0 )  
  4. {  
  5.     //其他的实现代码  
  6. }  

   注意:在Mac OS X v10.5版本中,向nil发送消息的结果与上面的描述会稍有不同。在Mac OS X v10.4以及更以前的版本中,向nil发送消息是完全有效的,只要消息的返回值是对象,任意类型的指针,void,或者是其他大小小于或者等于sizeof(void*)的整型标量。此时,发送给nil的消息将返回nil。如果发送nil的消息的返回值不是上述几种类型(比如说返回的类型是结构体,或者是浮点类型,或者是向量类型的),其返回值则是未定义的。因此,在Mac
OS X v10.4以及更老的版本中,我们不应该依赖于发送给nil对象的消息的返回值,除非该消息的返回值是一个对象,任意类型的指针,或者是任意大小小于或者是等于sizeof(void *)的整型标量。

抱歉!评论已关闭.