在目标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 悬挂的指针。相反,当对象不存在时,僵尸对象将其位于同一内存地址。实际上,我们所有的内存现在都泄漏了,但这是值得的,因为我们可能能够追踪崩溃的原因。僵尸对象只有一件事:如果有人触摸它,它会尖叫,并报告其更换的对象。因此,我们可以很好地检测到通过是一个悬空的指针来发送消息的尝试。