你混淆了两个非常不同的东西。僵尸不是悬空指针。它是您在调试情况下创建的,用于跟踪悬空指针(即调试)。
正如我想你所理解的,一个悬空指针是当对象 A 引用对象 B 时引起的,但是对象 B 的释放方式使得它的保留计数下降到零并且不存在。
一个典型的场景是我们分配了一个 Cocoa 对象 adelegate
并且delegate
随后不存在了。许多 Cocoadelegate
属性传统上是非弧弱的 ( assign
),所以如果 Cocoa 对象现在尝试与它的 对话delegate
,我们可能会崩溃。
正如您所说的那样,解决方案是在委托对象不存在时分配nil
给属性。delegate
幸运的是,这种情况变得越来越不可能,因为 Apple 正在整个 Cocoaassign
中用weak
(arcweak)代表替换代表。
但是悬空指针也可能通过线程问题发生。
由悬空指针引起的崩溃可能很难追踪,因为当崩溃发生时,通常在导致指针悬空的释放之后很久。Zombies 是一种没有悬空指针的调试工具。相反,当一个对象不复存在时,一个僵尸对象会在相同的内存地址处取而代之。实际上,我们所有的内存现在都泄漏了,但这对于测试目的是值得的,因为我们可能能够追踪到崩溃的原因。僵尸对象只做一件事:如果有人触摸它,它就会尖叫,并报告它替换了什么样的对象。因此,我们可以以良好的顺序检测到通过悬空指针发送消息的尝试。