在实例化新视图控制器时从内存中删除视图控制器

时间:2016-04-28 16:50:29

标签: ios swift memory-leaks

在我的应用程序中,我实例化新的视图控制器而不是使用segues,因为它在动画中看起来更好,因此我的视图在后台继续运行。这会导致大量内存泄漏。

我回到主屏幕的代码是:

let mainStoryboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
        let vc  : UIViewController = mainStoryboard.instantiateViewControllerWithIdentifier("MainScreen") as UIViewController
        self.presentViewController(vc, animated: false, completion: nil)

此视图控制器在后台仍处于活动状态,因此不应再次实例化。我该怎么做。

当我使用上面的代码关闭我的视图控制器时,它也不会卸载它,它会一直在后台运行。如何在屏幕消失后立即卸载它。

我尝试过做

override func viewDidDisappear(animated: Bool) {
    super.viewDidDisappear(animated)
    view.removeFromSuperview()
    view = nil
}

然而,这不能正常工作。以这种方式退出视图控制器时,如何从内存中正确销毁视图控制器。

2 个答案:

答案 0 :(得分:10)

您只需要使用:

编辑Swift 4.2

self.dismiss(animated:true, completion: nil)

剩下的工作是ARC

为了在调试过程中为您提供帮助,您还可以添加以下代码:

 if let app = UIApplication.shared.delegate as? AppDelegate, let window = app.window {
        if let viewControllers = window.rootViewController?.children {
            for viewController in viewControllers {
                print(viewController.debugDescription)
            }
        }
    }

答案 1 :(得分:0)

此问题的重要原因与内存管理有关!

如果您具有“强引用”或“委托”或“关闭”之类的东西,并且您没有管理这些对象,则您的视图控制器将具有强大的引用能力,并且永远不会被关闭。

在调用viewDidDisappear之后,应该在视图控制器中获得“ deinit”回调。如果未调用“ deinit”,则您的视图控制器仍处于活动状态,并且具有很强的参考力。