“向nil发送消息”是什么意思,为什么这是一个特例?

时间:2009-07-02 13:25:16

标签: objective-c null

我刚刚开始阅读Objective-C教程,并且有一节“向nil发送消息”:

  

Cocoa有几种模式   利用这个事实。该   从消息返回的值为nil   也可能有效:

这是什么意思?我似乎无法遵循它。

5 个答案:

答案 0 :(得分:10)

nil的特殊处理意味着您可以执行以下操作:

SomeClass * someObject;
someObject = nil;
[someObject doSomething];

你可以放心,什么都不会发生。

现在,为什么这很重要?

在Objective-C中,向对象发送消息意味着告诉该对象做某事,或者向该对象询问某些信息。一些例子:

[someObject updateRecords]; // 1
x = [someObject size];      // 2

第1行向someObject发送一条名为updateRecords的消息,第2行向同一对象发送一条名为size的消息,该消息应返回一个值。这些消息归结为方法调用,最终运行的实际代码由Objective-C运行时系统确定,因为Objective-C是一种动态类型语言。

要确定要调用哪个方法,运行时系统将从相关对象的地址(上面的示例中为someObject)中读取信息,以确定它是哪个类的实例。使用该信息,它能够查找适当的方法来调用,当所有已经计算出来的时候,它会执行方法中的代码。

如果运行时系统没有将nil视为特殊情况,那么如果您尝试执行顶部显示的代码,它可能会崩溃。 nil被定义为零,因此运行时将开始从存储在内存中的零位置的地址读取信息,这几乎被视为访问冲突。

答案 1 :(得分:9)

  • nil基本上是一个空指针(即它是存储在指针中的数字零)。
  • 所有发送给nil的邮件都是合法的(它们不会导致崩溃),但它们不会做任何事情。
  • 所有发送给nil的消息都返回nil,或0,或0.0或NO,具体取决于返回类型。

答案 2 :(得分:5)

您可以发送任何消息给nil。什么都没发生。

在这些文档中你究竟不明白到底是什么?

答案 3 :(得分:2)

与其他语言(如C#)相比,nil消息传递的优点在于,您可以编写执行多个方法调用的代码,而无需在每个步骤中测试nil。

id obj1 = [SomeClass object];
id obj2 = [obj1 doSomething];
id obj3 = [obj2 anotherMethod];

id thingICareAbout = [obj3 doSomethingElse];

如果你经历了几个步骤来到thingICareAbout,它会节省大量不必要的代码行,以便在使用它们之前不必测试obj1,obj2等是否为零。如果需要,您可以在结尾检查thingICareAbout是否为零。有时你甚至不必这样做,如果你的代码在nil时仍然有效(或原始值为0)。

在C#中,您必须明确检查每个对象是否为nil,围绕该代码块设置异常处理,或者只希望没有任何中间对象为零。

要记住的另一件事(我刚刚学会了!)是10.5改变了这种行为 - 以前它只对整数和指向对象的指针是安全的,而不是结构或浮点值。当您查看其他代码时,您可能会看到一些额外的错误检查。

答案 4 :(得分:1)

它会做你所期望的:没有。