如果上述答案没有帮助,请检查您的代码是否在您收到此错误的类中使用 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
这是因为您必须删除该MyViewController
keyPath 的观察者 ( )。最好在MyViewController
被解雇之前执行此操作,例如:
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
self.view.layer.removeObserver(self, forKeyPath: "bounds")
}
现在,当您尝试MyViewController
从导航堆栈中弹出时,不会出现错误。