【问题标题】:Zoombie vs nil object僵尸与零对象
【发布时间】:2018-04-24 00:24:16
【问题描述】:
在目标C中,我们可以向nil对象发送消息。
Zoombie (dangling pointer) 对象是指向内存已释放的对象的对象。即不指向任何有效的内存位置。
在这种情况下,引用不为 nil,而是无效的地址。
这是崩溃的原因吗?
如果我们尝试向已释放的对象发送消息,在这种情况下,我们的程序也会崩溃,因为 over object 可能不是 nil 并且可能具有无效的内存地址。
这就是为什么对于 NON - ARC,在某些情况下,我们在 **dealloc()**
中发送发布消息后也会设置 obj = nil
我清楚这个概念吗?
谢谢,
【问题讨论】:
标签:
objective-c
memory-management
dangling-pointer
【解决方案1】:
你混淆了两个非常不同的东西。僵尸不是悬空指针。它是您在调试情况下创建的,用于跟踪一个悬空指针(即调试)。
我想你明白,当对象 A 引用了对象 B,但对象 B 以这样一种方式释放时,它的保留计数下降到零并且不存在时,就会引起悬空指针。
一个典型的场景是我们为一个 Cocoa 对象分配了一个delegate,然后delegate 就消失了。许多 Cocoa delegate 属性传统上是非弧弱的 (assign),因此如果 Cocoa 对象现在尝试与其delegate 对话,我们可能会崩溃。
正如您所说的那样,解决方案是在委托对象不存在时将nil 分配给delegate 属性。幸运的是,这种情况一直不太可能发生,因为 Apple 正在整个 Cocoa 中用 weak (arcweak) 代表替换 assign 代表。
但悬空指针也可能因线程问题而发生。
由悬空指针引起的崩溃很难追踪,因为当崩溃发生时,通常在导致指针悬空的释放之后很久。 Zombies 是一种调试工具,其中有 no 悬空指针。相反,当一个对象不存在时,一个僵尸对象会在相同的内存地址上取而代之。实际上,我们所有的内存现在都泄漏了,但这对于测试目的是值得的,因为我们可能能够追踪到崩溃的原因。僵尸对象只做一件事:如果有人触摸它,它就会尖叫,并报告它替换了什么样的对象。因此,我们可以很好地检测到尝试通过 一直是悬空指针的方式发送消息。