Zoombie vs nil 对象

sru*_*017 1 memory-management objective-c dangling-pointer

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

Zoombie(悬空指针)对象是一个指向其内存被释放的对象的对象。即不指向任何有效的内存位置。

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

这是崩溃的原因吗?

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

我清楚这个概念吗?

谢谢,

mat*_*att 5

你混淆了两个非常不同的东西。僵尸不是悬空的指针。它是您在调试情况下创建的用于跟踪悬空指针(即调试)的东西。


一个悬空指针,正如我想你所理解的,是当对象 A 有一个对对象 B 的引用时引起的,但是对象 B 以这样一种方式被释放,它的保留计数下降到零并不再存在。

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

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

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

由悬空指针引起的崩溃可能很难追踪,因为崩溃发生时,通常是在指针悬空的释放之后很久。Zombies 是一种调试工具,其中没有悬空指针。相反,当一个对象不存在时,僵尸对象会在相同的内存地址上取而代之。实际上,我们所有的内存现在都在泄漏,但这对于测试目的来说是值得的,因为我们可能能够追踪崩溃的原因。僵尸对象只做一件事:如果有人触摸它,它就会尖叫,并报告它替换了什么样的对象。因此,我们可以发现,在良好的秩序,企图通过何种方式发送消息就一直悬空指针。