从内存中删除未使用的 ViewController

Posted

技术标签:

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

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

当我在 loginVC 中时,我登录并执行 Segue 到 mainVC。

我现在想要的是,我想让所有未使用的 ViewControllers 都被“删除”,以节省内存。 这将如何运作?

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

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 【参考方案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 件事

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

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

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

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

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

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

【讨论】:

以上是关于从内存中删除未使用的 ViewController的主要内容,如果未能解决你的问题,请参考以下文章

Spritekit 节点未从内存中删除

从数组中取出未定义数量的 ViewController

当从其父视图中删除第二个 ViewController 时,FirstViewController 不起作用

从其他 ViewController 中删除带有标签的视图

核心数据错误:文件仍未删除

我在从导航堆栈中删除 ViewController 时遇到问题?