-[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]:消息发送到释放的实例的主要内容,如果未能解决你的问题,请参考以下文章
[CustomViewController respondsToSelector:]:消息发送到释放的实例