Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在解除锁定时将IBOutlets设置为零_Objective C_Iphone_Cocoa Touch_Memory Management - Fatal编程技术网

Objective c 在解除锁定时将IBOutlets设置为零

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指针没有害处 您链

在这里标题为“内存警告”的部分中,我不明白为什么在dealloc中将IBOutlet设置为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,可以将其保留在自己的代码中

快速的谷歌搜索找到了这个帖子: