crash日志:
*** Terminating app due to uncaught exception 'NSRangeException', reason: 'Cannot remove an observer <XXXViewController 0x7ff158707f80> for the key path "xxx" from <XXXViewController 0x7ff158707f80> because it is not registered as an observer.'
分析原因:在使用KVO时,add observer和remove observer都是配对出现的,首先添加成为观察者,然后在释放内存的时候移除。例如:
override func viewDidLoad() {
super.viewDidLoad()
AppUnreadNumManager.instance.addObserver(self, forKeyPath: "xxx", options: .new, context: nil)
}
deinit {
AppUnreadNumManager.instance.removeObserver(self, forKeyPath: "xxx", context: nil)
}
通常情况下,这样写是没有问题的,但是有时候控制器可能还没有加载(viewDidLoad方法没走),然后就被释放了(deinit方法走了),这样就会出现上面那个bug。
我项目中出现这个bug的原因是:我在某个控制器开启KVO监听,正好它又