Objective c Zoombie vs nil对象

Objective c Zoombie vs nil对象,objective-c,memory-management,dangling-pointer,Objective C,Memory Management,Dangling Pointer,在objective C中,我们可以向nil对象发送消息 Zoombie(悬挂指针)对象是指向内存已释放的对象的对象,即不指向任何有效内存位置 在这种情况下,引用不包含nil,而是包含无效地址 这就是坠机的原因吗 如果我们试图向一个已释放的对象发送消息,在这种情况下,我们的程序也会崩溃,因为over object可能不是nil,并且可能有invaild内存地址。 这就是为什么在**dealoc()** 我清楚这个概念吗 谢谢,你混淆了两件截然不同的事情。僵尸不是悬空的指针。它是您在调试情况下创建

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

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

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

这就是坠机的原因吗

如果我们试图向一个已释放的对象发送消息,在这种情况下,我们的程序也会崩溃,因为over object可能不是nil,并且可能有invaild内存地址。 这就是为什么在
**dealoc()**

我清楚这个概念吗


谢谢,

你混淆了两件截然不同的事情。僵尸不是悬空的指针。它是您在调试情况下创建的跟踪悬空指针(即调试)的东西


正如我想您所理解的,当对象A引用了对象B,但对象B被释放时,它的retain计数下降到零并且不存在,就会产生悬空指针

一个典型的场景是,我们将Cocoa对象分配给
委托
,然后
委托
就不存在了。许多Cocoa
delegate
属性传统上是非ARC弱属性(
assign
),因此如果Cocoa对象现在试图与其
delegate
对话,我们可能会崩溃

正如您正确地说的,解决方案是在委托对象不存在时将
nil
分配给
delegate
属性。幸运的是,这种情况越来越不可能发生,因为苹果公司在整个Cocoa将
assign
代理替换为
weak
(arcweak)代理

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


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

您混淆了两种截然不同的东西。僵尸不是悬空的指针。它是您在调试情况下创建的跟踪悬空指针(即调试)的东西


正如我想您所理解的,当对象A引用了对象B,但对象B被释放时,它的retain计数下降到零并且不存在,就会产生悬空指针

一个典型的场景是,我们将Cocoa对象分配给
委托
,然后
委托
就不存在了。许多Cocoa
delegate
属性传统上是非ARC弱属性(
assign
),因此如果Cocoa对象现在试图与其
delegate
对话,我们可能会崩溃

正如您正确地说的,解决方案是在委托对象不存在时将
nil
分配给
delegate
属性。幸运的是,这种情况越来越不可能发生,因为苹果公司在整个Cocoa将
assign
代理替换为
weak
(arcweak)代理

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

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