设置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