Ios 在导航堆栈中用观察员替换控制器时,应用程序终止

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

我的应用程序的第一个控制器有一个avplayer,所以我实现了在viewwillbeen上设置的观察器,在viewdiddemove上删除

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)

可能是这样,但关键问题是找到造成这次坠机的原因。一旦你知道是什么导致了应用程序崩溃,修复它通常是小菜一碟。