Objective c 在解除锁定时将IBOutlets设置为零
在这里标题为“内存警告”的部分中,我不明白为什么在dealloc中将IBOutlet设置为nil。如果Objective c 在解除锁定时将IBOutlets设置为零,objective-c,iphone,cocoa-touch,memory-management,Objective C,Iphone,Cocoa Touch,Memory Management,在这里标题为“内存警告”的部分中,我不明白为什么在dealloc中将IBOutlet设置为nil。如果 self.anOutlet = nil 导致本主题中提到的崩溃,为什么要将ivar设置为零 一般来说,当您已经在调用release时,为什么要在dealloc中将ivar设置为nil?在已释放的对象上发送消息会导致崩溃,向nil对象发送消息会被忽略。在释放后,指针基本上无效,再次访问它可能会导致崩溃。通过在release之后将变量设置为nil,可以防止崩溃的发生。访问nil指针没有害处 您链
self.anOutlet = nil
导致本主题中提到的崩溃,为什么要将ivar设置为零
一般来说,当您已经在调用release时,为什么要在dealloc中将ivar设置为nil?在已释放的对象上发送消息会导致崩溃,向nil对象发送消息会被忽略。在
释放后,指针基本上无效,再次访问它可能会导致崩溃。通过在release
之后将变量设置为nil
,可以防止崩溃的发生。访问nil指针没有害处
您链接到的示例简单地说明了为什么在发布
后将变量或ivar设置为nil
总是一个好主意,即使看起来变量/ivar不会再次被访问
在本例中,anOutlet
ivar实际上是在您的dealloc
方法之后由超类访问的,因此如果您不将其设置为nil,则会发生崩溃。这样的场景很难通过查看代码来发现,因此最好在发布后将每个变量置零,即使是在dealloc中。有时当一个属性变得无效(设置为nil)时,我们也希望使其他属性无效。如果一个类使用self.property\u name=nil使一个属性无效,那么这将发送一条release消息,如果我们已经调用了该属性的release,那么这将导致dealloc崩溃。如果失效发生在一个超类中,那么这个错误是隐藏的,而且相当严重。因此,每当超类可能使属性无效时,最好将其设置为nil,而不仅仅是解除分配。有时崩溃是件好事,快速解决方案会隐藏更深层次的问题。调用已发布的变量可能是您想知道的事情
《iOS配方》一书提到了这个问题:
清理-解除锁定
除了在-dealoc中释放所有相关的实例变量外,我们的示例还将它们设置为nil。这种做法是Cocoa程序员们争论最激烈的话题之一,争论的双方都有份量。这本书根本不打算参与辩论:我们将它们设为零,但这并不意味着你必须这样做。如果您不喜欢dealloc中的nil,可以将其保留在自己的代码中
快速的谷歌搜索找到了这个帖子: