我是 iOS 开发新手。我已经看过很多有关以编程方式控制内存管理的文档,但是我很好奇 iOS 在以下之间导航时处理内存的默认方式:
- 标签
- 主从 View
- 带有选项卡的主从 View
(注意:当我说主从 View 时,我基本上指的是导航 Controller 。我只是将其称为“主从 View ”来定义导航 Controller 层次结构的两个不同级别,因此它方便我们讨论)
我将通过我的问题逐一浏览这 3 个主题:
标签
- 当应用首次启动时,是否会将每个选项卡的所有数据加载到 RAM 中,还是仅加载最初显示的选项卡的数据?
- 如果问题 1 的答案是否定的:每当您从一个选项卡切换到另一个选项卡时,是否会释放您所切换的选项卡的数据?
- 如果 1 的答案是肯定的:如果应用程序需要在每个选项卡中从数据库加载数据:它是否仅将用户界面/本地功能加载到 RAM 中,并且仅在该选项卡时从数据库加载数据被选中(当需要此数据时)?
Master-Detail View (如果 Master 是 UITableViewController,而 Detail 只是 UIViewController 并且它们嵌入在导航 Controller 中)
- 当您加载详细信息 View ,然后返回主视图时,详细信息 View 中的数据是否仍保留在 RAM 中?
- 当您加载详细信息 View ,然后返回主视图,然后进入不同的详细信息 View 时,第一个详细信息 View 的数据是否保留在 RAM 中?
带有选项卡的主从 View (在主视图是 UITableViewController 的情况下,详细信息只是 UIViewController 并且它们嵌入在导航 Controller 中)
- 当您加载详细信息 View ,然后切换到其他选项卡时,详细信息 View 的数据仍在 RAM 中吗?
- 当您加载详细信息 View ,然后返回其主视图,然后切换选项卡时,详细信息 View 中的数据仍在 RAM 中吗?
所有这些问题都涉及 iOS 的默认行为。
最佳答案
一些想法:
诊断:诊断正在发生的情况的最简单方法是将日志语句添加到 subview Controller 中。例如,如果您将以下行添加到
viewDidLoad
和dealloc
方法中,您将被通知为 Controller 并被加载和释放:NSLog(@"%s", __FUNCTION__);
然后,配备了在实例化和释放时记录的 View Controller ,您可以在容器 Controller (选项卡栏 Controller 、导航 Controller 、分割 View Controller 等)的任意组合中使用这些 Controller ,并且您可以轻松地看到你自己怎么了。
关于您询问的特定容器 Controller :
标签栏 Controller :在 Storyboard中,标签栏 Controller 会在您选择各自的标签时(而不是之前)分配子 Controller ,但保留旧标签。 (在 NIB 中,这仅取决于您以编程方式执行的操作;您可以预加载它们,也可以不预加载它们。)
导航 Controller :当您推送到特定场景时,导航 Controller 会加载新的子 Controller ,但不会在此过程中释放以前的 View Controller 。只有当您从导航堆栈中弹出 View Controller 时,该 Controller 才会被释放。
分割 View Controller :当您在分割 View Controller 中执行替换segue时,它将实例化新的子场景,并释放以前的子 Controller 。如果之前的子 Controller 本身是一个容器 Controller ,例如选项卡或导航 Controller ,那么它的子 Controller 也将被释放。
关于ios - iOS什么时候分配内存和释放内存? (相对于导航和选项卡 Controller 的默认行为),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17621067/