objective-c - "sending a message to nil"是什么意思,为什么是特例?

标签 objective-c null

<分区>

我刚开始阅读 Objective-C 教程,其中有一节是关于“向 nil 发送消息”:

There are several patterns in Cocoa that take advantage of this fact. The value returned from a message to nil may also be valid:

这是什么意思?我似乎跟不上它。

最佳答案

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 被定义为零,因此运行时将开始从存储在内存中位置零的地址读取信息,这几乎可以保证是访问冲突。

关于objective-c - "sending a message to nil"是什么意思,为什么是特例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1074321/

相关文章:

java - 如何避免在 Java 中检查空值?

objective-c - 如何在单击按钮时在同一窗口中加载新 View ?

ios - XCode 6.3 警告 : Comparison of address of 'myObject' not equal to null pointer is always true

json - JOLT 仅在不为 NULL 时连接

Java 处理 if null then new 的不同方法

java - 合并二维数组中的重复行,同时保留没有任何重复项的行

objective-c - objective-c id *

ios - 如何在 ios 中迭代 JSON 对象

Objective-C - iVar 作用域方法变量?

php - 如何处理此 PHP/mysql 插入语句中的空值