ViewController OS X(Swift)上的应用程序崩溃
这应该是OSX Swift的决定 问题-应用程序在RepresenteViewController OS X(Swift)上的应用程序崩溃,swift,macos,dismiss,nsviewcontroller,osx-yosemite,Swift,Macos,Dismiss,Nsviewcontroller,Osx Yosemite,这应该是OSX Swift的决定 问题-应用程序在RepresenteNSViewController上崩溃 有两个NSViewController–当我在它们之间进行转换时出现问题-应用程序关闭,表示NSViewController 它们使用presentViewController和dismissViewController的方法 此处有问题的示例项目: 如何重现错误(仅限约塞米蒂): 1.我打开第一个NSViewController 2.打开第二个NSViewController后 3.接
NSViewController上崩溃
有两个NSViewController
–当我在它们之间进行转换时出现问题-应用程序关闭,表示NSViewController
它们使用presentViewController和dismissViewController的方法
此处有问题的示例项目:
如何重现错误(仅限约塞米蒂):
1.我打开第一个NSViewController
2.打开第二个NSViewController后
3.接下来,返回第一个(第二个)
4.然后再次尝试打开第二个NSViewController-最后,应用程序会崩溃(但在El Capitan上一切正常)在您的第二个ViewController的viewDidLoad()中,您将自己注册为“dismisSecondViewController”通知的观察者:
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(SecondViewController.dismisSelf),
name:"dismisSecondViewController",
object: nil)
问题是,在10.11之前,您必须先注销任何观察者,然后才能解除分配(即从内存中删除),否则NSNotificationCenter将继续向现在占用此解除分配内存区域的对象发送消息-它可能是垃圾或其他不响应这些消息的对象。由于视图控制器在切换时显然会被解除分配,因此这是您的问题
因此,修复非常简单:将以下deinit
方法添加到SecondViewController
类中
deinit {
NSNotificationCenter.defaultCenter().removeObserver(self)
}
在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)
}