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

App terminated when replacing controller with observers in navigation stack

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

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)
}

当我收到深层链接时,我会创建一个新的导航堆栈,然后用新的导航堆栈替换当前的导航控制器堆栈:

            navigationVC.viewControllers = newNavigationVC.viewControllers

应用程序没有正确加载新控制器(如果我删除了观察者的代码,这会正确发生),而是崩溃:

libc++abi.dylib: terminating with uncaught exception of type NSException

我不知道发生了什么,因为 xcode 没有给我任何指示,而且跟踪在汇编中,所以它也没有帮助。

有人能告诉我正确的调试方向吗?

对于那些感兴趣的人,我用这个解决方案对此进行了调试:

NSSetUncaughtExceptionHandler { exception in
print(exception)
print(exception.callStackSymbols)
}

在 didFinishLaunchingWithOptionsreturn 之前

这给了我一个跟踪包含:

class AVPlayerItem 的一个实例 0x17000d9d0 被释放,而键值观察者仍然在其中注册。

移除中缺少观察者,放置:

            self.avQueuePlayer.currentItem?.removeObserver(self, forKeyPath: "status")

解决了我的问题。

通常一次删除所有观察者更有意义。

NotificationCenter.default.removeObserver(self)