转换到释放内存后关闭ViewController

Lin*_*rth 13 uiviewcontroller dismiss ios swift

我想释放我的ViewController在解除它后使用的内存.我使用以下代码来呈现新的ViewController并解除旧的ViewController:

let sB: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let newVC: UIViewController = sB.instantiateViewController(withIdentifier: "MyVC")
self.present(newVC, animated: true, completion: { x in
    oldVC.dismiss(animated: false, completion: { _ in //oldVC: variable keeping track of currently visible view controller
        print("done")
    })
})
Run Code Online (Sandbox Code Playgroud)

此代码在解雇后成功显示newVC和打印.但是,我的记忆仍然保持在屏幕上的高度. 我究竟做错了什么?doneoldVColdVC

FYI

  • 我正在使用ENSwiftSideMenu
    • 由于我没有以不同的方式使用它,所有我的ViewControllers都是ENSideMenuNavigationController的子类
  • 我收到有关未在窗口层次结构中的分离视图和视图的控制台警告
  • 所有ViewControllers,都presentingViewControllerpresentedViewControllernil

季亨达*_*季亨达 5

检查以下问题:

  1. 在提供新的ViewController之前,您应该关闭旧的ViewController,否则您将同时关闭新的ViewController。
  2. Swift使用ARC来管理内存。由于某些对象对其有很强的引用,因此未发行oldVC。举个例子,我有一个带有变量tableView的ViewController。当ViewController发布时,tableView将发布。但是同时,如果将其链接到另一个未发布的ViewController,则尽管先前的ViewController已发布,tableView也不会发布。

解:

  1. 提出UINavigationController并使用setViewControllers来管理ViewController的过渡。
  2. 删除无用的引用 oldVC

如果真的不明白。您可以搜索:

  1. UIViewController过渡


spa*_*sas 3

你的oldVC不会被释放,因为你的newVC(和任何UIViewController)默认保留对其的强引用presentingViewController- 呈现它的控制器。如果不是这种情况,您将永远无法newVC在不干扰视图层次结构的情况下安全地关闭您的视图。

就您的具体问题而言,为了释放您的旧视图控制器,我建议您取消第一个视图控制器,oldVC然后newVC从堆栈中较早的另一个 ViewController 显示您的视图控制器(可能是UIApplication shared().keyWindow?.rootViewController