僵尸 vs 零对象

Zoombie vs nil object

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

Zoombie(悬挂指针) object 是指向其内存为 released.i 的对象的对象。e 未指向任何有效的内存位置。

在这种情况下,引用不包含 nil,而是包含无效地址。

这是崩溃的原因吗?

如果我们尝试向已释放的对象发送消息,在这种情况下,我们的程序也会崩溃,因为 over object 可能不是 nil,并且可能有无效的内存地址。 这就是为什么对于 NON - ARC,在某些情况下我们在 **dealloc()**

中发送释放消息后也会设置 obj = nil

我清楚这个概念了吗?

谢谢,

你混淆了两个截然不同的东西。僵尸不是悬空指针。这是您在调试情况下创建的东西,用于 追踪 悬空指针(即调试)。


悬空指针,我想你是这样理解的,当对象 A 引用了对象 B,但对象 B 以这样一种方式被释放,它的保留计数下降到 0 并且不存在了。

一个典型的场景是我们给一个Cocoa对象分配了一个delegate然后delegate随后就消失了。许多 Cocoa delegate 属性传统上是非弧弱的 (assign),因此如果 Cocoa 对象现在尝试与其 delegate 通信,我们可能会崩溃。

正如您所说的那样,解决方案是在委托对象不存在时将 nil 分配给 delegate 属性。幸运的是,这种情况一直在变得越来越不可能,因为 Apple 在整个 Cocoa.

期间将 assign 代表替换为 weak (arcweak) 代表

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

悬挂指针导致的崩溃很难追踪,因为崩溃通常发生在导致指针悬挂的释放很久之后。 Zombies 是一种调试工具,其中 没有 悬挂指针。相反,当一个对象不复存在时,一个僵尸对象会在相同的内存地址处取而代之。实际上,我们所有的内存现在都泄漏了,但这对于测试目的来说是值得的,因为我们可以追踪崩溃的原因。僵尸对象只做一件事:如果有人触摸它,它会尖叫,并报告它替换的对象类型。因此,我们可以按良好的顺序检测到通过 成为悬空指针的方式发送消息的尝试。