在这里标题为'Memory Warnings'的部分http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmNibObjects.html中,我没有理解为什么在dealloc中将IBOutlet设置为nil。如果
self.anOutlet = nil
导致主题中提到的崩溃,为什么他们将ivar设置为nil?
一般情况下,当你已经在释放时,为什么要在dealloc中将ivar设置为nil?
答案 0 :(得分:12)
在release
之后,指针基本上无效,再次访问它可能会导致崩溃。通过在nil
之后将变量设置为release
,可以防止崩溃发生。访问nil指针没有坏处。
您链接的示例只是为了说明为什么在nil
之后将变量或ivar设置为release
总是一个好主意,即使看起来变量/ ivar不是再次访问。
在示例中,anOutlet
ivar实际上是在你的dealloc
方法后由超类访问的,所以如果你没有将它设置为nil,你会得到一个崩溃。像这样的场景很难通过查看代码来发现,因此在发布后将每个变量置为零是一个好主意,即使在dealloc中也是如此。
答案 1 :(得分:1)
在已释放的对象上发送消息会导致崩溃,忽略向nil对象发送消息。
答案 2 :(得分:1)
有时崩溃是件好事,快速解决方案会隐藏更深层次的问题。调用已发布的变量可能是您想要了解的内容。
本书 iOS Recipes 引用了这个问题:
-dealloc清理
除了在-dealloc中释放所有相关的实例变量之外,我们的示例还将它们设置为nil。这种做法是可可程序员中最激烈争论的主题之一,并且论证的双方都很重要。本书并不打算参加辩论:我们将它们设置为零,但这并不意味着你必须这样做。如果您不喜欢nil-in-dealloc,请随意将其从您自己的代码中删除。
快速谷歌搜索找到了这个帖子:
http://www.cocoabuilder.com/archive/cocoa/204055-why-should-we-set-ivars-to-nil-in-dealloc.html
答案 3 :(得分:0)
有时当一个属性变为无效(设置为nil)时,我们也希望其他属性也无效。如果类使用self.property_name = nil使属性无效,那么这将发送一条释放消息,如果我们已经在该属性上调用了release,则会导致dealloc崩溃。如果失效发生在超类中,则此错误被隐藏并且非常讨厌。因此,每当超类可能使属性无效时,将其设置为nil而不是仅仅取消分配可能是个好主意。