Objective-C Difference between setting nil and releasing
我已经知道在dealloc中你做了[object release];但在viewDidUnload(在UIViewController子类中)你做了self.object = nil。 真正的区别是因为self.object = nil(我们假设对象是(nonatomic, retain)属性)保留nil(什么也不做)然后释放旧值然后引用计数为0对吗?
self.object = nil调用你的setter,它将释放旧值,将成员设置为nil,并可能做其他事情(这是一个方法,所以它可以做任何事情)。"任何"的一部分是有潜在危险的;例如,看到这个问题。
[object release]释放旧值,但将成员留作现在悬挂的指针,这是一个很好的错误配方。在dealloc中它并不重要,因为指针本身也即将消失,但在任何其他情况下,释放成员而不将其设置为nil是一个非常糟糕的主意。
(作为旁注,你永远不应该假设释放一个对象给它一个引用计数为0.它会释放你的引用,但是其他对象可能仍然引用它。)
-
另请注意,Apple特别建议不要在init和dealloc中使用setter / getter(出于好的理由),因此在dealloc中使用[object release] - 它不仅仅是"在dealloc中它并不重要",在dealloc中它是推荐的 方式。
-
是的,我的意思是有一个非零指针并不重要(因为在dealloc发布后你不需要做object = nil)
-
实际上,对于合成的ivars,setter必须使用dealloc。 请参阅developer.apple.com/iphone/library/documentation/cocoa/搜索短语"合成实例变量"。
-
@ustun,那不一定是真的。 您可以使用合成的ivars并使用如下声明进行合成:@ synthesize myIvar = _myIvar; 然后在dealloc中,使用[_myIvar release];
-
@ustun注意[myivar release]实际上并没有使用setter。 它使用支持self.myivar的实例变量。 所以[myivar release]和myivar = nil在dealloc中完全没问题。 但是self.myivar = nil不是。
如果在没有[object release]的情况下执行object = nil,则可能导致内存泄漏。如果之后不使用object = nil执行[object release],则对象将成为@Jim建议的悬空指针。 self.object = nil是用于设置函数调用的糖。
如果您执行[对象发布],并且想要访问该对象,应用程序就会崩溃。
如果你做object = nil,并且想要访问该对象,则不会执行任何操作。
原因是在[对象释放]中,您试图释放该对象。所以它没有任何指针(没有记忆)。在object = nil,中,你试图用空指针分配对象。所以如果你试图访问该对象什么都不会发生。
通常我们将代码写为[object release]; object = nil;,因为如果你意外地访问该对象,应用程序将不会崩溃。
如果你只是释放一个对象,那么它将成为释放对象。
如果您尝试对释放的对象执行任何类型的操作,那么您的应用程序崩溃。为避免此类事故,始终首选"在释放后将对象分配为零"。因为我们都知道在nil上执行的任何操作都不会被执行:)