设置IBOutlets为零dealloc

问题描述:

在标题为'内存警告'这里http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmNibObjects.html的部分,我不明白为什么IBOutlet在dealloc中设置为零。如果设置IBOutlets为零dealloc

self.anOutlet = nil 

导致主题中提到的崩溃,为什么他们将ivar设置为零?

一般来说,当你已经调用release时,为什么你会在dealloc中设置一个ivar为零?

经过release后,指针基本无效,再次访问它可能会导致崩溃。通过在release之后将变量设置为nil,可以防止发生崩溃。访问零指针没有任何坏处。

您链接的示例只是演示了为什么在release之后将变量或ivar设置为nil始终是个好主意,即使看起来变量/ ivar不会再被访问。

在这个例子中,anOutlet伊娃实际上是由超dealloc方法来访问,所以如果你不把它设为零,你会得到一个崩溃。像这样的场景通过查看代码很难发现,所以最好在发布之后删除每个变量,即使在dealloc中也是如此。

在发布的对象上发送消息导致崩溃,将消息发送给nil对象时将被忽略。

有时候,当一个属性变得无效(设置为零)时,我们希望使其他属性无效。如果一个类通过使用self.property_name = nil使一个属性失效,那么这将发送一个释放消息,如果我们已经在该属性上调用了释放,这将导致dealloc崩溃。如果失效发生在超类中,那么这个错误是隐藏的并且相当恶劣。所以,无论何时超类可能会使属性失效,将其设置为零而不是仅仅释放它可能是一个好主意。

有时碰撞是一件好事,快速解决方案会隐藏更深层的问题。调用一个发布的变量可能是你想知道的。

iOS的食谱指的是这个问题:

清理在-dealloc
除了释放所有相关的实例变量在-dealloc,我们的例子它们设置为零。这种做法是Cocoa程序员中争论最激烈的话题之一,并且这个论点的两个方面都很重要。本书并不打算参与辩论:我们将它们设置为零,但这并不意味着您必须这样做。如果你不喜欢nil-in-dealloc,可以随意将它从你自己的代码中删除。

快速谷歌搜索发现,这个线程:
http://www.cocoabuilder.com/archive/cocoa/204055-why-should-we-set-ivars-to-nil-in-dealloc.html