29

我已经了解到,在dealloc你做[object release];但在viewDidUnload(在 UIViewController 子类中)你做self.object = nil。真正的区别是什么,因为self.object = nil(我们假设对象是一个(nonatomic, retain)属性)保留nil(什么都不做)然后释放旧值,然后引用计数为 0,对吗?

4

4 回答 4

55

self.object = nil调用你的 setter,它将释放旧值,将成员设置为nil,并可能做其他事情(它是一个方法,所以它可以做任何事情)。其中的“任何”部分都有潜在的危险;例如,看到这个问题。

[object release]释放旧值,但将成员保留为现在悬空的指针,这是解决错误的好方法。这dealloc并不重要,因为指针本身也即将消失,但在任何其他情况下,释放成员而不将其设置为nil.

(作为旁注,你不应该假设释放一个对象给它的引用计数为 0。它释放你的引用,但其他对象可能仍然有对它的引用。)

于 2009-07-31T05:18:19.967 回答
6

如果不这样做object = nil[object release]可能会导致内存泄漏。如果您之后不这样做[object release]object = nil则对象将成为@Jim 建议的悬空指针。self.object = nil是 setter 函数调用的糖。

于 2012-06-21T20:37:44.863 回答
1

如果你只是释放一个对象,那么它将成为释放的对象。

如果您尝试对释放的对象执行任何类型的操作,那么您的应用程序就会崩溃。为避免此类事故,始终首选“释放对象后将其分配给 nil”。因为我们都知道在 nil 上执行的任何操作都不会被执行 :)

于 2011-05-10T06:15:57.187 回答
1

如果您执行 [object release],并且想要访问该对象,应用程序就会崩溃。如果您执行 object = nil,并且想要访问该对象,则不会执行任何操作。

原因是在 [object release] 中,您试图释放该对象。所以它没有任何指针(没有记忆)。在object = nil,你试图用空指针分配对象。所以如果你试图访问该对象,什么都不会发生。

通常我们将代码写为 [object release]; object = nil;因为如果您意外访问该对象,应用程序不会崩溃。

于 2013-06-19T10:51:38.127 回答