Objective-C设置nil和释放之间的区别

时间:2009-07-31 05:05:34

标签: objective-c cocoa-touch properties release null

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

4 个答案:

答案 0 :(得分:54)

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

[object release]释放旧值,但将成员留作现在悬挂的指针,这是一个很好的错误配方。在dealloc中它并不重要,因为指针本身即将消失,但在任何其他情况下,释放成员而不将其设置为nil是一个非常糟糕的主意。

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

答案 1 :(得分:5)

如果您执行object = nil而没有[object release],则可能会导致内存泄漏。如果你事后[object release]没有object = nil,那么对象就会成为@Jim建议的悬空指针。 self.object = nil是用于setter函数调用的糖。

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:1)

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

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