Zoombie vs nil object



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

Zoombie(悬挂指针(对象是一个对象,该对象指向其内存的对象。I.e不指向任何有效的内存位置。

在这种情况下,参考不会持有零,而是无效的地址。

这是崩溃的原因吗?

如果我们尝试将消息发送到已发布的对象在这种情况下,我们的程序也会崩溃,因为对象可能不会零,并且可能具有Invaild内存地址。这就是为什么要 non -arc ,在某些情况下,我们也将OBJ = nil设置在**dealloc()**

中发送发布后。

我是否清楚这个概念?

谢谢,

您正在混淆两个截然不同的事情。僵尸不是一个悬空的指针。这是您在调试情况下创建的东西跟踪一个悬空的指针(即调试(。


据我所知,

悬挂的指针是当对象a具有对象B的引用时引起的,但是对象b的保留计数的释放方式降低到零并不存在。p>一个典型的情况是我们为delegate分配一个可可对象,而delegate随后不存在。传统上,许多可可delegate属性是非arrc弱(assign(,因此,如果可可对象现在试图与其delegate交谈,我们可能会崩溃。

正如您正确地说的那样,当委托对象不存在时,解决方案是将nil分配给delegate属性。幸运的是,这种情况一直都变得越来越少,因为苹果正在用weak(ArcWeak(代表替换assign代表。

但是,悬空的指针也可以通过螺纹问题发生。

由悬挂的指针引起的崩溃可能很难追踪,因为崩溃通常是在发行后很长时间导致指针悬挂的。僵尸是一种调试工具,那里有 no 悬挂的指针。相反,当对象不存在时,僵尸对象将其位于同一内存地址。实际上,我们所有的内存现在都泄漏了,但这是值得的,因为我们可能能够追踪崩溃的原因。僵尸对象只有一件事:如果有人触摸它,它会尖叫,并报告其更换的对象。因此,我们可以很好地检测到通过是一个悬空的指针来发送消息的尝试。

最新更新