从内存中删除未使用的 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的主要内容,如果未能解决你的问题,请参考以下文章