什么是“发送消息到无”的意思是,为什么它是一个特例? [重复](What does “sendi

2019-06-24 18:55发布

这个问题已经在这里有一个答案:

  • 在Objective-C将消息发送到零 11分的答案

我刚开始读的Objective-C教程,并且对“发送消息到部分nil ”:

有可可几种模式,利用这个事实。 从消息返回到零值也可能是有效的:

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

Answer 1:

特殊处理的nil意味着你可以做到以下几点:

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

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

那么,为什么这很重要?

在Objective-C,发送消息到一个对象是指,告诉对象做一些事情,或询问一些信息的对象。 一些例子:

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

1线发送someObject被叫消息updateRecords ,和第2行发送相同的对象被称为消息size ,预计返回一个值。 这些消息可归结为方法调用,并且最终的实际代码被运行由Objective-C运行系统确定,因为目标C是一个动态型语言。

来确定要调用哪个方法,运行时系统读取从对象的所讨论的地址(信息someObject ,在上面的实施例)制定出它是什么类的一个实例。 利用这些信息,它能够查找适当的方法来调用,当所有已想通了,它执行的方法的代码。

如果运行时系统没有把nil作为一个特殊的情况下,它可能会崩溃,如果你试图执行在上面所示的代码。 nil被定义为零,因此运行时将开始读取来自存储器中存储在位置零的地址,这是几乎gauranteed是访问冲突信息。



Answer 2:

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


Answer 3:

您可以发送任何消息到零。 什么都没发生。

究竟什么是你不会在这些文档明白了吗?



Answer 4:

关于无消息的伟大的事情相比,如C#等语言的是,您可以编写执行多个方法调用,而不必在每一步,以测试零代码。

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

id thingICareAbout = [obj3 doSomethingElse];

如果你要经过几个步骤去thingICareAbout ,这样可以节省很多不必要的代码行没有测试,如果OBJ1,OBJ2等等都在使用它们之前为零。 你可以只检查是否thingICareAbout为零,一旦在最后,如果你需要。 有时候,你甚至不用做,如果你的代码仍然有效时,它(为原始值或0)为零。

在C#中,你将不得不明确地检查每个对象都是零,建立异常周围代码块处理,或者只是希望没有中间对象是永远为零。

还有一两件事要记住(我刚刚得知自己!)是10.5改变了这种行为 - 它使用的是这只是对整数和对象的指针,而不是结构或浮点值的安全。 您可能会看到当你看着因为这样其他代码一些额外的错误检查。



Answer 5:

它确实你所期望的:没有。



文章来源: What does “sending a message to nil” mean, and why is it a special case? [duplicate]