nil 和释放对象的区别
Posted
技术标签:
【中文标题】nil 和释放对象的区别【英文标题】:difference between nil and released object 【发布时间】:2010-07-25 15:41:11 【问题描述】:我是 Objective-C 的新手,我无法理解这一点。我知道我可以向 nil 发送消息(它对 Objective-C 的特性大肆宣传),但我不能向已发布的对象发送消息,在这种情况下会出现异常,它们之间有什么区别?
【问题讨论】:
【参考方案1】:nil
是内存地址 0。当这个地址被发送消息时,运行时知道不做任何事情,因为它是 预定义的不存在的对象地址。
然而,一个被释放的对象将是一个随机的内存地址,因为当以前有效的对象被销毁时,指针并没有被清除。由于它不是规定的不存在的对象地址,运行时不知道它是无效的,并会尝试向它发送消息。这通常会立即使您的程序崩溃。
释放变量后,您可以通过将变量设置为 nil
来避免这种情况。
【讨论】:
@您可以通过在释放变量后将变量设置为 nil 来避免这种情况。谢谢,我不知道。但是如果一个变量有 retain count == 2 会发生什么,并且释放后它不会被释放,如果我将它设置为 nil,但它有其他所有者,我不会好,我对吗?跨度> @Aristarh:一旦你释放了一个对象,你就应该认为它已经死了。不要担心其他参考。对象的其他所有者在完成后负责释放它。因此,将对已释放对象的引用设置为nil
是“本地安全的”。【参考方案2】:
nil 是“指向空”,它允许向 nil(空)发送消息。 一个对象有一个地址,它的数据抵抗。您使用此地址发送消息并释放对象。像这样:
id myObject; // Initialized some where else
[myObject release];
然后向它发送这样的消息:
[myObject someMessage]; // At this point myObject != nil. Not allowed
那么你实际上是在尝试向现在发布的对象的地址发送消息。这是不允许的。
myObject = nil;
[myObject someMessage]; // Allowed
【讨论】:
以上是关于nil 和释放对象的区别的主要内容,如果未能解决你的问题,请参考以下文章
Delphi Create(nil), Create(self), Create(Application)的区别
iOS 中的 nilNilNULLNSNull 僵尸对象和野指针