1

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

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

在这种情况下,引用不持有零,而是无效的地址。

这是崩溃的原因吗?

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

我清楚这个概念吗?

谢谢,

4

1 回答 1

5

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


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

一个典型的场景是我们分配了一个 Cocoa 对象 adelegate并且delegate随后不存在了。许多 Cocoadelegate属性传统上是非弧弱的 ( assign),所以如果 Cocoa 对象现在尝试与它的 对话delegate,我们可能会崩溃。

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

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

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

于 2018-04-24T00:38:04.977 回答