4

我正在开发一个 iphone 应用程序,当我打开我的 NSZombieEnabled 时,我经常会因错误而崩溃:

*** -[CALayer retain]: message sent to deallocated instance 0xe6012e0

当我在视图控制器中推送或弹出视图时,它总是会出现。有时之前会出现这个错误:

-[UIApplication endIgnoringInteractionEvents] called without matching -beginIgnoringInteractionEvents. Ignoring.

这是什么意思?任何人都有线索或遇到过这个问题?

非常感谢您的帮助!

罗曼

4

3 回答 3

14

这可能意味着您正在尝试保留已释放的 UI 对象,例如 UIButton。有多种方法可以追踪此问题,但如果您可以缩小应用程序中发生这种情况的范围,我通常会开始注释发布,直到我看到有问题的发布在哪里。我的猜测是你发布了一些自动发布的东西。

于 2011-07-26T21:38:37.703 回答
2

如果上述答案没有帮助,请检查您的代码是否在您收到此错误的类中使用 KVO。当 KVO 向您的观察类发送有关键值更改的消息时,如果该类已被 ARC 释放,则 KVO 将尝试提醒内存中不存在的地址有关该更改,从而导致您的应用程序抛出这个错误。

考虑一下,一个名为的类MyViewController,您想观察bounds它的属性何时view.layer发生变化,表明布局从横向变为纵向。因此,您添加以下行:

// self is MyViewController
self.view.layer.addObserver(self, forKeyPath: "bounds", options: .new, context: nil)

view如果大小发生变化,这将提醒您的班级。

但是如果你的 viewController 被解除了,比如将UINavigationController它从堆栈中弹出,KVO 仍然会尝试提醒MyViewController视图的边界已经改变(因为现在它已经消失了)。然后,当 KVO 执行此操作时,您的应用程序将崩溃。在您的调试控制台中,您会看到以下消息:

-[MyViewController retain]: message sent to deallocated instance

这是因为您必须删除该MyViewControllerkeyPath 的观察者 ( )。最好在MyViewController被解雇之前执行此操作,例如:

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    self.view.layer.removeObserver(self, forKeyPath: "bounds")
}

现在,当您尝试MyViewController从导航堆栈中弹出时,不会出现错误。

于 2017-04-28T01:14:15.023 回答
1

我想要的不仅仅是@Tony答案。因为它是正确的。

您可能正在使用UI object's layer或它的sublayer. 所以在使用它之前检查一下实际上 UI 没有发布;

if(UI object) //has instance
{
   //now use UI object.
}
于 2014-05-12T08:42:30.087 回答