在目标C中,我们可以向nil
对象发送消息。
Zoombie(悬空指针)对象是一个对象,它指向一个已释放内存的对象。即没有指向任何有效的内存位置。
在这种情况下,引用不会保留nil而是无效地址。
这是崩溃的原因吗?
如果我们尝试向已发布的对象发送消息,在这种情况下我们的程序也会崩溃,因为对象可能没有nil并且可能有invaild内存地址。
这就是 NON - ARC 的原因,在某些情况下,我们在**dealloc()**
我清楚这个概念吗?
谢谢,
答案 0 :(得分:4)
你混淆了两件截然不同的事情。僵尸不是一个悬垂的指针。这是您在调试情况下创建的跟踪悬空指针(即调试)的内容。
我认为您理解的悬垂指针是在对象A引用对象B时引起的,但对象B的释放方式使其保留计数降至零并且不再存在。
典型情况是我们为Cocoa对象分配delegate
,delegate
随后不再存在。许多Cocoa delegate
属性传统上都是非常弱(assign
),因此如果Cocoa对象现在试图与其delegate
对话,我们就会崩溃。
正如您所说,解决方案是在委托对象不存在时将nil
分配给delegate
属性。幸运的是,这种情况一直不太可能发生,因为Apple正在整个Cocoa中用assign
(arcweak)代表替换weak
个代表。
但悬空指针也可能通过线程问题发生。
由悬空指针引起的崩溃可能很难追踪,因为崩溃发生时,通常很长时间后导致指针悬挂。僵尸是一个调试工具,其中有没有悬空指针。相反,当一个对象不存在时,一个僵尸对象取代它在同一个内存地址。实际上,我们所有的记忆现在都在泄漏,但这对于测试来说是值得的,因为我们可能能够找到崩溃的原因。僵尸对象只做一件事:如果有人触摸它会尖叫,并报告它取代了什么类型的对象。因此,我们可以按照良好的顺序检测通过将作为悬空指针的方式发送消息的尝试。