【问题标题】:Delete unused ViewController from memory从内存中删除未使用的 ViewController
【发布时间】:2017-07-05 17:22:04
【问题描述】:

我有 3 个 ViewController。 第一个 ViewController 正在检查用户是否已登录。 如果是 performSegue 到 mainVC,如果没有 performSegue 到 loginVC。

当我在 loginVC 中时,我登录并执行 Segue 到 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。

我正在使用“显示详细信息” - 仅转场,除非使用此方法时我创建了自定义转场。

【问题讨论】:

  • “Swift 使用自动引用计数 (ARC) 来跟踪和管理应用程序的内存使用情况。在大多数情况下,这意味着内存管理在 Swift 中“正常工作”,您不需要自己考虑内存管理。当不再需要类实例时,ARC 会自动释放类实例使用的内存。”摘自:Apple Inc. “Swift 编程语言 (Swift 3.0.1)。”苹果公司,2016-10-21T07:00:00Z。电子书。本材料可能受版权保护。在 iBooks Store 上查看这本书:itun.es/us/jEUH0.l

标签: ios iphone swift uiviewcontroller


【解决方案1】:

删除应该由 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
    }
}

【讨论】:

    【解决方案2】:

    记忆问题

    是的,它就是这样工作的。你不需要关心释放视图控制器。

    系统将跟踪对视图控制器对象的引用。当您不再引用这些时,内存将被释放。您可以在 swift 语言文档中了解更多信息:

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

    代码在做什么

    presentViewController 方法以模态方式显示视图控制器。完成关闭是在新的视图控制器完成后执行的。在更近的地方发生了 2 件事

    1. popToRootViewController删除sourceViewController对象内的所有视图控制器。
    2. 窗口的rootViewController 设置为新值。

    这实际上将根视图控制器更改为另一个。这似乎是成功登录后的有效操作。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-08
      • 1970-01-01
      • 1970-01-01
      • 2012-12-05
      • 2012-12-16
      • 2012-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多