将 UIViewControllers 保存在内存中
Posted
技术标签:
【中文标题】将 UIViewControllers 保存在内存中【英文标题】:Keeping UIViewControllers in memory 【发布时间】:2014-08-23 01:46:10 【问题描述】:我正在构建一个 ios 应用程序,其中一个“汉堡菜单”类型的抽屉打开到左侧的选项列表。像这样:
每次您点击一个项目时,例如“设置”,它都会加载一个新的视图控制器并将其显示在主视图控制器上。现在,我想知道的问题是我是否应该在每次单击菜单中的新项目时释放视图控制器。
例如:
您正在查看收件箱 你点击设置 我释放 InboxViewController 并分配初始化 SettingsViewController 我将 SettingsViewController 设为主视图控制器我想将所有视图控制器保留在内存中,因为我认为如果之前分配了它,它将提供从一个到下一个更平滑的过渡,而不必每次都等待分配它。
我正在使用 ARC
这是不好的做法吗?我的内存中可能有 6-7 个视图控制器。
【问题讨论】:
您在使用 ARC 吗?您是否明确“释放”对象? @Mike 我正在使用 ARC 【参考方案1】:查看 SDK,Apple 做出了两种选择:UINavigationController
将整个 VC 堆栈保持在顶部以下,而UIPageViewController
积极释放除当前页面之外的任何页面。
这是“速度/空间”交易的示例。预计算和缓存对象会更快(一旦运行),但会占用更多内存。更积极地释放和构建(或重建)会产生一些运行时间成本,但占用的内存更少。
这个问题也可能是优化过快或不必要的示例。对于少数典型的 VC,分配速度很快,内存占用(应该)很小。改变方法可能对速度或空间影响不大。
我会从更简单的方式开始(可能让 VC 被动释放更简单),看看是否存在需要解决的可证明问题。
【讨论】:
【参考方案2】:如果你考虑一下你在做什么,它实际上与 UITabBarController 没有什么不同。视图在第一次查看之前不会加载,但随后会无限期地保持“活动”状态。我认为只要您保持加载的视图控制器的数量合理(个位数),您可能会没事,但需要注意的是,如果它们都在进行一些密集的处理/加载/等,它可能会成为问题。
【讨论】:
加载它们后,它们不会进行任何额外的处理,直到您再次查看它们并对它们执行操作。我想我会尝试进行一些测试,但从人们所说的情况来看,听起来会没事的。 我同意,我认为你应该没问题。【参考方案3】:我不一定认为将所有 ViewController 保存在内存中是一件好事,除非 View 包含需要很长时间才能获取的对象(即打开 UIDocument 或从 NSURLRequest)。
希望对您有所帮助!
【讨论】:
以上是关于将 UIViewControllers 保存在内存中的主要内容,如果未能解决你的问题,请参考以下文章
内存泄漏,多个 UIViewControllers 的其他问题
如何在布局类似于fork的UIViewControllers之间导航和传递数据?
将 UIViewControllers 放在其他 UIViewControllers 中是不好的做法吗?