Zoombie vs nil对象

时间:2018-04-24 00:24:17

标签: objective-c memory-management dangling-pointer

在目标C中,我们可以向nil对象发送消息。

Zoombie(悬空指针)对象是一个对象,它指向一个已释放内存的对象。即没有指向任何有效的内存位置。

在这种情况下,引用不会保留nil而是无效地址。

这是崩溃的原因吗?

如果我们尝试向已发布的对象发送消息,在这种情况下我们的程序也会崩溃,因为对象可能没有nil并且可能有invaild内存地址。 这就是 NON - ARC 的原因,在某些情况下,我们在**dealloc()**

中发送发布消息后也设置了obj = nil

我清楚这个概念吗?

谢谢,

1 个答案:

答案 0 :(得分:4)

你混淆了两件截然不同的事情。僵尸不是一个悬垂的指针。这是您在调试情况下创建的跟踪悬空指针(即调试)的内容。

我认为您理解的悬垂指针是在对象A引用对象B时引起的,但对象B的释放方式使其保留计数降至零并且不再存在。

典型情况是我们为Cocoa对象分配delegatedelegate随后不再存在。许多Cocoa delegate属性传统上都是非常弱(assign),因此如果Cocoa对象现在试图与其delegate对话,我们就会崩溃。

正如您所说,解决方案是在委托对象不存在时将nil分配给delegate属性。幸运的是,这种情况一直不太可能发生,因为Apple正在整个Cocoa中用assign(arcweak)代表替换weak个代表。

但悬空指针也可能通过线程问题发生。

由悬空指针引起的崩溃可能很难追踪,因为崩溃发生时,通常很长时间后导致指针悬挂。僵尸是一个调试工具,其中有没有悬空指针。相反,当一个对象不存在时,一个僵尸对象取代它在同一个内存地址。实际上,我们所有的记忆现在都在泄漏,但这对于测试来说是值得的,因为我们可能能够找到崩溃的原因。僵尸对象只做一件事:如果有人触摸它会尖叫,并报告它取代了什么类型的对象。因此,我们可以按照良好的顺序检测通过作为悬空指针的方式发送消息的尝试。