【问题标题】:Crash application on dismiss ViewController OS X (Swift)关闭 ViewController OS X (Swift) 时应用程序崩溃
【发布时间】:2016-08-15 19:22:52
【问题描述】:
这应该是在 OS X Swift 上的决定
问题 - 应用程序在代表 NSViewController 时崩溃
有两个 NSViewController - 问题是,当我在它们之间进行转换时 - 应用程序关闭时出现错误代表 NSViewControllers。
这里使用presentViewController和dismissViewController方法。
此处有问题的示例项目:git@github.com:IgorCova/Freelance.git
如何重现错误(仅在 Yosemite 上):
1.我先打开NSViewController
2. 在我打开第二个 NSViewController
3.接下来,回到第一个(dismiss第二个)
4. 然后再次尝试打开第二个 NSViewController - 最后,应用程序崩溃(但在 El Capitan 上一切正常,没有错误)
【问题讨论】:
标签:
swift
macos
dismiss
nsviewcontroller
osx-yosemite
【解决方案1】:
在您的SecondViewController 的 viewDidLoad() 中,您将自己注册为“dismisSecondViewController”通知的观察者:
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(SecondViewController.dismisSelf),
name:"dismisSecondViewController",
object: nil)
问题在于,在 10.11 之前,您必须在所有观察者被释放(即从内存中删除)之前取消注册,否则 NSNotificationCenter 将继续向现在占用这个释放的内存区域的东西发送消息— 它可能是垃圾或其他不响应这些消息的对象。由于您的视图控制器在您切换它们时显然会被释放,这是您的问题。
因此修复很简单:将以下 deinit 方法添加到您的 SecondViewController 类中
deinit {
NSNotificationCenter.defaultCenter().removeObserver(self)
}