设置IBOutlets在dealloc中为nil

时间:2009-11-05 17:06:07

标签: objective-c iphone cocoa-touch memory-management

在这里标题为'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?

4 个答案:

答案 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而不是仅仅取消分配可能是个好主意。