【问题标题】:Removing a view controller from memory when instantiating a new view controller实例化新视图控制器时从内存中删除视图控制器
【发布时间】:2016-08-23 13:59:49
【问题描述】:

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

我返回主屏幕的代码是:

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
}

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

【问题讨论】:

  • 您不能从内部移除视图控制器(即 viewDidDisappear) - 您需要做的是移除对它的所有引用,此时 ARC 将释放它。如果您引用它的唯一位置是在上面创建它时,那么只需在呈现它的任何内容上调用dismissViewController,就可以释放您的视图控制器。

标签: ios swift memory-leaks


【解决方案1】:

这个问题的一个重要原因与内存管理有关!

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

在调用 viewDidDisappear 之后,您应该在视图控制器中获得“deinit”回调。如果 'deinit' 没有被调用,那么你的视图控制器仍然活着并且它有很强的引用。

【讨论】:

    【解决方案2】:

    你只需要使用:

    编辑 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)
                }
            }
        }
    

    【讨论】:

    • 我应该把dismissViewControllerAnimated()放在哪里?我应该把它放在我要关闭的视图控制器中吗?这似乎行不通。不会让我回到新的视图控制器
    • 在 viewController 中创建一个按钮,将其命名为 DISMISS,为 touchupinside 连接一个 ibaction 并在此方法中插入dismiss 行
    • Swift 3.1 : self.dismiss(animated: true, completion: nil)
    • 你在哪个viewController中写代码?来源/上一个/早期的?还是当前/第二个/以后的一个现在成为焦点?
    • @Cindeselia 当前焦点
    猜你喜欢
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    相关资源
    最近更新 更多