在导航堆栈中用观察者替换控制器时应用程序终止
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)
我的应用程序的第一个控制器有一个 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)