僵尸 vs 零对象
Zoombie vs nil object
在objective C中,我们可以向nil
对象发送消息。
Zoombie(悬挂指针) object 是指向其内存为 released.i 的对象的对象。e 未指向任何有效的内存位置。
在这种情况下,引用不包含 nil,而是包含无效地址。
这是崩溃的原因吗?
如果我们尝试向已释放的对象发送消息,在这种情况下,我们的程序也会崩溃,因为 over object 可能不是 nil,并且可能有无效的内存地址。
这就是为什么对于 NON - ARC,在某些情况下我们在 **dealloc()**
中发送释放消息后也会设置 obj = nil
我清楚这个概念了吗?
谢谢,
你混淆了两个截然不同的东西。僵尸不是悬空指针。这是您在调试情况下创建的东西,用于 追踪 悬空指针(即调试)。
悬空指针,我想你是这样理解的,当对象 A 引用了对象 B,但对象 B 以这样一种方式被释放,它的保留计数下降到 0 并且不存在了。
一个典型的场景是我们给一个Cocoa对象分配了一个delegate
然后delegate
随后就消失了。许多 Cocoa delegate
属性传统上是非弧弱的 (assign
),因此如果 Cocoa 对象现在尝试与其 delegate
通信,我们可能会崩溃。
正如您所说的那样,解决方案是在委托对象不存在时将 nil
分配给 delegate
属性。幸运的是,这种情况一直在变得越来越不可能,因为 Apple 在整个 Cocoa.
期间将 assign
代表替换为 weak
(arcweak) 代表
但悬挂指针也可能通过线程问题发生。
悬挂指针导致的崩溃很难追踪,因为崩溃通常发生在导致指针悬挂的释放很久之后。 Zombies 是一种调试工具,其中 没有 悬挂指针。相反,当一个对象不复存在时,一个僵尸对象会在相同的内存地址处取而代之。实际上,我们所有的内存现在都泄漏了,但这对于测试目的来说是值得的,因为我们可以追踪崩溃的原因。僵尸对象只做一件事:如果有人触摸它,它会尖叫,并报告它替换的对象类型。因此,我们可以按良好的顺序检测到通过 将 成为悬空指针的方式发送消息的尝试。
在objective C中,我们可以向nil
对象发送消息。
Zoombie(悬挂指针) object 是指向其内存为 released.i 的对象的对象。e 未指向任何有效的内存位置。
在这种情况下,引用不包含 nil,而是包含无效地址。
这是崩溃的原因吗?
如果我们尝试向已释放的对象发送消息,在这种情况下,我们的程序也会崩溃,因为 over object 可能不是 nil,并且可能有无效的内存地址。
这就是为什么对于 NON - ARC,在某些情况下我们在 **dealloc()**
我清楚这个概念了吗?
谢谢,
你混淆了两个截然不同的东西。僵尸不是悬空指针。这是您在调试情况下创建的东西,用于 追踪 悬空指针(即调试)。
悬空指针,我想你是这样理解的,当对象 A 引用了对象 B,但对象 B 以这样一种方式被释放,它的保留计数下降到 0 并且不存在了。
一个典型的场景是我们给一个Cocoa对象分配了一个delegate
然后delegate
随后就消失了。许多 Cocoa delegate
属性传统上是非弧弱的 (assign
),因此如果 Cocoa 对象现在尝试与其 delegate
通信,我们可能会崩溃。
正如您所说的那样,解决方案是在委托对象不存在时将 nil
分配给 delegate
属性。幸运的是,这种情况一直在变得越来越不可能,因为 Apple 在整个 Cocoa.
assign
代表替换为 weak
(arcweak) 代表
但悬挂指针也可能通过线程问题发生。
悬挂指针导致的崩溃很难追踪,因为崩溃通常发生在导致指针悬挂的释放很久之后。 Zombies 是一种调试工具,其中 没有 悬挂指针。相反,当一个对象不复存在时,一个僵尸对象会在相同的内存地址处取而代之。实际上,我们所有的内存现在都泄漏了,但这对于测试目的来说是值得的,因为我们可以追踪崩溃的原因。僵尸对象只做一件事:如果有人触摸它,它会尖叫,并报告它替换的对象类型。因此,我们可以按良好的顺序检测到通过 将 成为悬空指针的方式发送消息的尝试。