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

时间:2016-04-14 10:19:17

标签: ios objective-c iphone swift cocoa-touch

假设我有一个视图控制器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的打印消息不会显示。

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

1 个答案:

答案 0 :(得分:2)

当您从ViewControllerB提出ViewControllerA时,ViewControllerB在其ViewControllerA变量中保留presentingViewController的强引用,这就是为什么ViewControllerA从不得到去初始化。您需要做的是直接从rootViewController更改app delegates窗口ViewControllerA,这意味着您必须摆脱segues。