假设我有一个视图控制器A(UIViewController的子类),它有一个按钮,如果按下按钮,它将使用segue加载并显示视图控制器B(UIViewController的子类)(所以我使用接口构建器建立连接。 Segue类型是Show。
当显示B时,我永远不会回到A,所以我想要杀死,摧毁,粉碎,破坏它,以便珍贵的几个字节的内存可以用于其他事情。
以下是A:
的代码class ViewControllerA: UIViewController {
deinit {
print("I am immortal haha I cannot die!!!")
print("This will not be displayed!!!")
}
}
以下是B的代码:
class ViewControllerB: UIViewController {
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
print("Go away old view controller!!!")
appDelegate.window!.rootViewController = self // (1)
}
}
我在(1)的代码替换了应用程序的根视图控制器。但是,旧的视图控制器似乎在内存中停留,因为它的deinit的打印消息不会显示。
如何完成卸载不需要的视图控制器及其视图的简单任务?非常感谢
答案 0 :(得分:2)
当您从ViewControllerB
提出ViewControllerA
时,ViewControllerB
在其ViewControllerA
变量中保留presentingViewController
的强引用,这就是为什么ViewControllerA
从不得到去初始化。您需要做的是直接从rootViewController
更改app delegates窗口ViewControllerA
,这意味着您必须摆脱segues。