-[CALayer retain]:消息发送到释放的实例

Posted

技术标签:

【中文标题】-[CALayer retain]:消息发送到释放的实例【英文标题】:-[CALayer retain]: message sent to deallocated instance 【发布时间】:2010-07-13 09:47:12 【问题描述】:

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

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

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

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

这是什么意思?谁有线索或遇到过这个问题?

非常感谢您的帮助!

罗曼

【问题讨论】:

好的,我已经部分找到了它崩溃的原因。对于遇到同样问题的人,请查看此链接:iphonedevsdk.com/forum/iphone-sdk-development/… 问题是我在 dealloc 方法中释放了一些 ViewController。永远不要这样做,每当调用 push/popViewController 时都会自动执行此操作。我认为仍然存在一些错误,因为我在最近的 10 次测试中遇到了这个错误。 对于那些遇到相同错误的人,请检查另一个问题:***.com/questions/3238823/… 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

// 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

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

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

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

【讨论】:

【参考方案3】:

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

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

if(UI object) //has instance

   //now use UI object.

【讨论】:

以上是关于-[CALayer retain]:消息发送到释放的实例的主要内容,如果未能解决你的问题,请参考以下文章

发送到已释放实例问题的消息

发送到已释放实例的消息

[UIImageAsset 保留]:发送到已释放实例的消息

[CustomViewController respondsToSelector:]:消息发送到释放的实例

[UINavigationController 保留]:发送到已释放实例的消息

发送到已释放实例的消息