代码之家  ›  专栏  ›  技术社区  ›  Romain Piel

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

  •  4
  • Romain Piel  · 技术社区  · 16 年前

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

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

    当我在视图控制器中按下或弹出视图时,它总是出现。以前有时会出现这样的错误:

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

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

    非常感谢你的帮助!

    罗曼

    3 回复  |  直到 16 年前
        1
  •  14
  •   Tony    15 年前

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

        2
  •  2
  •   Brandon A    9 年前

    如果上面的答案没有帮助,那么检查您的代码是否在收到此错误的类中使用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 retain]: message sent to deallocated instance
    

    这是因为必须移除观察者( 我的视图控制器 被解雇,所以:

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

    我的视图控制器 从导航堆栈中不会出现错误。

        3
  •  1
  •   Paresh Navadiya    12 年前

    我想要的不仅仅是 @Tony

    你可能在用 UI object's layer sublayer . 所以只要检查一下在使用它之前用户界面并没有被发布;

    if(UI object) //has instance
    {
       //now use UI object.
    }