Ios 在导航堆栈中用观察员替换控制器时,应用程序终止
我的应用程序的第一个控制器有一个avplayer,所以我实现了在viewwillbeen上设置的观察器,在viewdiddemove上删除Ios 在导航堆栈中用观察员替换控制器时,应用程序终止,ios,swift,xcode,nsnotificationcenter,Ios,Swift,Xcode,Nsnotificationcenter,我的应用程序的第一个控制器有一个avplayer,所以我实现了在viewwillbeen上设置的观察器,在viewdiddemove上删除 override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) addObservers() } override func viewDidDisappear(animated: Bool) { super.viewDidDisappe
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
addObservers()
}
override func viewDidDisappear(animated: Bool) {
super.viewDidDisappear(animated)
avQueuePlayer.pause()
// remove observers
NSNotificationCenter.defaultCenter().removeObserver(self, name: AVPlayerItemDidPlayToEndTimeNotification, object: nil)
NSNotificationCenter.defaultCenter().removeObserver(self, name: UIApplicationDidEnterBackgroundNotification, object: nil)
NSNotificationCenter.defaultCenter().removeObserver(self, name: UIApplicationWillEnterForegroundNotification, object: nil)
}
当我收到deeplink时,我会创建一个新的导航堆栈,然后用新的导航控制器堆栈替换当前的导航控制器堆栈:
navigationVC.viewControllers = newNavigationVC.viewControllers
该应用程序没有正确加载新控制器(如果我删除观察员的代码,则会正确加载),而是崩溃:
libc++abi.dylib: terminating with uncaught exception of type NSException
我不知道发生了什么,因为xcode没有给我任何指示,而且跟踪在汇编中,所以也没有帮助
有人能告诉我调试这个的正确方向吗?对于那些感兴趣的人,我用这个解决方案调试它: 放置
NSSetUncaughtExceptionHandler { exception in
print(exception)
print(exception.callStackSymbols)
}
返回didFinishLaunchingWithOptions之前
这给了我一个线索,其中包含:
AVPlayerItem类的实例0x17000d9d0已解除分配,而键值观察员仍在该实例中注册
拆除过程中有一名观察员失踪,他说:
self.avQueuePlayer.currentItem?.removeObserver(self, forKeyPath: "status")
修复了我的问题。通常一次删除所有观察者更有意义
NotificationCenter.default.removeObserver(self)
可能是这样,但关键问题是找到造成这次坠机的原因。一旦你知道是什么导致了应用程序崩溃,修复它通常是小菜一碟。