【发布时间】:2010-07-25 15:41:11
【问题描述】:
我是 Objective-C 的新手,我无法理解这一点。我知道我可以向 nil 发送消息(它对 Objective-C 的特性大肆宣传),但我不能向已发布的对象发送消息,在这种情况下会出现异常,它们之间有什么区别?
【问题讨论】:
标签: objective-c release null
我是 Objective-C 的新手,我无法理解这一点。我知道我可以向 nil 发送消息(它对 Objective-C 的特性大肆宣传),但我不能向已发布的对象发送消息,在这种情况下会出现异常,它们之间有什么区别?
【问题讨论】:
标签: objective-c release null
nil 是内存地址 0。当这个地址被发送消息时,运行时知道不做任何事情,因为它是 预定义的不存在的对象地址。
然而,一个被释放的对象将是一个随机的内存地址,因为当以前有效的对象被销毁时,指针并没有被清除。由于它不是规定的不存在的对象地址,运行时不知道它是无效的,并会尝试向它发送消息。这通常会立即使您的程序崩溃。
释放变量后,您可以通过将变量设置为 nil 来避免这种情况。
【讨论】:
nil 是“本地安全的”。
nil 是“指向空”,它允许向 nil(空)发送消息。 一个对象有一个地址,它的数据抵抗。您使用此地址发送消息并释放对象。像这样:
id myObject; // Initialized some where else
[myObject release];
然后向它发送这样的消息:
[myObject someMessage]; // At this point myObject != nil. Not allowed
那么你实际上是在尝试向现在发布的对象的地址发送消息。这是不允许的。
myObject = nil;
[myObject someMessage]; // Allowed
【讨论】: