我已经了解到,在dealloc
你做[object release];
但在viewDidUnload
(在 UIViewController 子类中)你做self.object = nil
。真正的区别是什么,因为self.object = nil
(我们假设对象是一个(nonatomic, retain)
属性)保留nil
(什么都不做)然后释放旧值,然后引用计数为 0,对吗?
4 回答
self.object = nil
调用你的 setter,它将释放旧值,将成员设置为nil
,并可能做其他事情(它是一个方法,所以它可以做任何事情)。其中的“任何”部分都有潜在的危险;例如,看到这个问题。
[object release]
释放旧值,但将成员保留为现在悬空的指针,这是解决错误的好方法。这dealloc
并不重要,因为指针本身也即将消失,但在任何其他情况下,释放成员而不将其设置为nil
.
(作为旁注,你不应该假设释放一个对象给它的引用计数为 0。它释放你的引用,但其他对象可能仍然有对它的引用。)
如果不这样做object = nil
,[object release]
可能会导致内存泄漏。如果您之后不这样做[object release]
,object = nil
则对象将成为@Jim 建议的悬空指针。self.object = nil
是 setter 函数调用的糖。
如果你只是释放一个对象,那么它将成为释放的对象。
如果您尝试对释放的对象执行任何类型的操作,那么您的应用程序就会崩溃。为避免此类事故,始终首选“释放对象后将其分配给 nil”。因为我们都知道在 nil 上执行的任何操作都不会被执行 :)
如果您执行 [object release],并且想要访问该对象,应用程序就会崩溃。如果您执行 object = nil,并且想要访问该对象,则不会执行任何操作。
原因是在 [object release] 中,您试图释放该对象。所以它没有任何指针(没有记忆)。在object = nil,
你试图用空指针分配对象。所以如果你试图访问该对象,什么都不会发生。
通常我们将代码写为 [object release]; object = nil;
因为如果您意外访问该对象,应用程序不会崩溃。