2010-07-25 67 views
1

我是Objective-C的新手,我无法理解这一点。我知道我可以发送一条消息给零(它对Objective-C的特性大肆宣传),但我不能发送消息给发布的对象,在这种情况下得到一个异常,它们之间的区别是什么?零与释放对象之间的区别

回答

3

nil是内存地址0运行时知道什么时候这个地址传递消息不做任何事情,因为它是预定不存在的对象地址。

然而,解分配的对象将随机内存地址,因为指针没有清理时,以前有效的对象被销毁。由于它不是规定的不敏感对象地址,因此运行时不知道它是无效的,并且会尝试将消息发送给它。这通常会使程序立即崩溃。

您可以通过一旦你释放了他们设置变量nil避免这种情况。

+0

@您可以通过将变量设置为零来避免这种情况,一旦您释放它们。 谢谢,我不知道。但是如果一个变量保留count == 2会发生什么情况,并且释放后它不会被释放,如果我将它设置为零,但它有其他所有者,我不会很好,对不对? – Burjua 2010-07-25 16:14:08

+0

@Aristarh:只要你释放一个对象,你应该认为它已经死了。不要担心其他参考。对象的其他所有者负责在完成它后释放它。因此,将'nil'设置为已被释放的对象的引用是“本地安全的”。 – zneak 2010-07-25 16:44:01

+0

好的,非常感谢您的解答,+1))) – Burjua 2010-07-25 16:49:25

0

nil是'指向没有',它允许发送消息到零(无)。 一个对象有一个数据抵抗的地址。您使用此地址发送消息并释放该对象。就像这样:

id myObject; // Initialized some where else 
[myObject release]; 

,然后将其发送类似这样的消息:

[myObject someMessage]; // At this point myObject != nil. Not allowed 

那么你实际上是试图将消息发送到现在释放的对象的地址。这是不允许的。

myObject = nil; 
[myObject someMessage]; // Allowed 
相关问题