使用导航堆栈中的观察者替换控制器时应用终止

时间:2017-04-05 14:56:59

标签: ios swift xcode nsnotificationcenter

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

            navigationVC.viewControllers = newNavigationVC.viewControllers

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

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

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

[surename], [name] [secondname]. [extra]

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

有人能指出我正确的调试方向吗?

2 个答案:

答案 0 :(得分:0)

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

App SIGABRTs on AppDelegate

推出

NSSetUncaughtExceptionHandler { exception in
print(exception)
print(exception.callStackSymbols)
}
返回didFinishLaunchingWithOptions之前

这给了我一条包含以下内容的痕迹:

AVPlayerItem类的实例0x17000d9d0已取消分配,而键值观察者仍在其中注册。

在移除中有一个失踪的观察者,将:

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

解决了我的问题。

答案 1 :(得分:0)

通常情况下,立即删除所有观察者会更有意义。

NotificationCenter.default.removeObserver(self)