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

Bla*_*man 5 null objective-c

我刚刚开始阅读Objective-C教程,并且有一个关于"发送消息nil"的部分:

Cocoa中有几种模式可以利用这一事实.从消息返回到nil的值也可能是有效的:

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

Tom*_*ing 11

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


e.J*_*mes 10

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

SomeClass * someObject;
someObject = nil;
[someObject doSomething];
Run Code Online (Sandbox Code Playgroud)

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

现在,为什么这很重要?

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

[someObject updateRecords]; // 1
x = [someObject size];      // 2
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 如果释放对象但仍保留指向旧内存位置的指针,则可能会发送消息给解除分配的内存(也称为僵尸).例如:`[someObject release]; [someObject someMethod];`.这与`someObject = nil;非常不同.[someObject someMethod];`即使将someObject设置为nil可能会在GC环境中释放它,将其设置为nil的行为也会阻止您向*deallocated*内存发送消息. (3认同)

rin*_*ind 5

您可以发送任何消息给零.什么都没发生.

你在那些文档中究竟是什么不明白的?