加载视图控制器,然后从内存中删除前一个

agr*_*986 6 iphone cocoa-touch objective-c ios swift

假设我有一个视图控制器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!!!")
  }
}
Run Code Online (Sandbox Code Playgroud)

这是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)
  }
}
Run Code Online (Sandbox Code Playgroud)

我在(1)的代码替换了应用程序的根视图控制器.但是,旧的视图控制器似乎留在内存中,因为它的deinit的打印消息不会显示.

如何完成卸载不需要的视图控制器及其视图的简单任务?非常感谢

Zel*_* B. 2

当您呈现ViewControllerBfrom时ViewControllerA,在其变量中ViewControllerB保留一个强引用,这就是为什么永远不会被取消初始化的原因。您需要做的是直接更改应用程序委托窗口,这意味着您必须摆脱转场。ViewControllerApresentingViewControllerViewControllerArootViewControllerViewControllerA