从内存中删除未使用的ViewController

时间:2017-07-05 17:22:04

标签: ios iphone swift uiviewcontroller

我有3个ViewController。 第一个ViewController正在检查用户是否已登录。 如果是,则执行查询到主VC,如果没有执行查看登录VC。

当我在loginVC时,我登录并执行toSeve to mainVC。

我现在想要的是,我想让所有未使用的ViewControllers被“删除”,以节省内存。 这怎么样?

我在StackOverflow中找到了这段代码:

class ManualSegue: UIStoryboardSegue {

  override func perform() {
    sourceViewController.presentViewController(destinationViewController, animated: true) {
      self.sourceViewController.navigationController?.popToRootViewControllerAnimated(false)
      UIApplication.sharedApplication().delegate?.window??.rootViewController = self.destinationViewController
    }
  }
}

这会做我想要的吗?看起来好像是因为这个方法正在弹出ViewController。

我正在使用“显示细节” - 仅限segues,除非使用此方法,我创建了一个自定义的Segue Segue。

2 个答案:

答案 0 :(得分:0)

删除应由Apple处理,您(理论上)不应该担心它,只要您不创建任何保留周期。通常,不要在块中对self有任何强烈的引用。有趣的是,上面的代码,应该解除ViewController(因此删除它)也有一个保留周期。根据需要添加[weak self]strongSelf强制转换应该有所帮助:

override func perform() {
    sourceViewController.presentViewController(destinationViewController, animated: true) { [weak self] in
        guard let strongSelf = self else { return }
        strongSelf.sourceViewController.navigationController?.popToRootViewControllerAnimated(false)
        UIApplication.sharedApplication().delegate?.window??.rootViewController = strongSelf.destinationViewController
    }
}

答案 1 :(得分:0)

记忆问题

是的,这就是它的工作原理。您无需处理释放视图控制器的问题。

系统将跟踪对视图控制器对象的引用。如果您不再引用这些内容,则会释放内存。您可以在快速语言文档中阅读更多内容:

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html

代码正在做什么

presentViewController方法以模态方式显示视图控制器。在呈现新视图控制器完成之后执行完成关闭。里面发生了两件事情

  1. popToRootViewController删除sourceViewController对象中的所有视图控制器。
  2. 窗口的
  3. rootViewController设置为新值。
  4. 这实际上将根视图控制器更改为另一个。这似乎是成功登录后的有效操作。

    我不知道步骤1是否必要。导航视图控制器无论如何都会消失,为什么要在其中弹出视图控制器呢?

    有关视图控制器的更多信息

    您可能也对视图控制器生命周期感兴趣。 UIKit开发人员文档包含有关视图控制器的详细信息:

    https://developer.apple.com/documentation/uikit/uiviewcontroller