ios - iOS什么时候分配内存和释放内存? (相对于导航和选项卡 Controller 的默认行为)

标签 ios memory tabs navigation master-detail

我是 iOS 开发新手。我已经看过很多有关以编程方式控制内存管理的文档,但是我很好奇 iOS 在以下之间导航时处理内存的默认方式:

  • 标签
  • 主从 View
  • 带有选项卡的主从 View

(注意:当我说主从 View 时,我基本上指的是导航 Controller 。我只是将其称为“主从 View ”来定义导航 Controller 层次结构的两个不同级别,因此它方便我们讨论)

我将通过我的问题逐一浏览这 3 个主题:

标签

  1. 当应用首次启动时,是否会将每个选项卡的所有数据加载到 RAM 中,还是仅加载最初显示的选项卡的数据?
  2. 如果问题 1 的答案是否定的:每当您从一个选项卡切换到另一个选项卡时,是否会释放您所切换的选项卡的数据?
  3. 如果 1 的答案是肯定的:如果应用程序需要在每个选项卡中从数据库加载数据:它是否仅将用户界面/本地功能加载到 RAM 中,并且仅在该选项卡时从数据库加载数据被选中(当需要此数据时)?

Master-Detail View (如果 Master 是 UITableViewController,而 Detail 只是 UIViewController 并且它们嵌入在导航 Controller 中)

  1. 当您加载详细信息 View ,然后返回主视图时,详细信息 View 中的数据是否仍保留在 RAM 中?
  2. 当您加载详细信息 View ,然后返回主视图,然后进入不同的详细信息 View 时,第一个详细信息 View 的数据是否保留在 RAM 中?

带有选项卡的主从 View (在主视图是 UITableViewController 的情况下,详细信息只是 UIViewController 并且它们嵌入在导航 Controller 中)

  1. 当您加载详细信息 View ,然后切换到其他选项卡时,详细信息 View 的数据仍在 RAM 中吗?
  2. 当您加载详细信息 View ,然后返回其主视图,然后切换选项卡时,详细信息 View 中的数据仍在 RAM 中吗?

所有这些问题都涉及 iOS 的默认行为。

最佳答案

一些想法:

  1. 诊断:诊断正在发生的情况的最简单方法是将日志语句添加到 subview Controller 中。例如,如果您将以下行添加到 viewDidLoaddealloc 方法中,您将被通知为 Controller 并被加载和释放:

    NSLog(@"%s", __FUNCTION__);
    

    然后,配备了在实例化和释放时记录的 View Controller ,您可以在容器 Controller (选项卡栏 Controller 、导航 Controller 、分割 View Controller 等)的任意组合中使用这些 Controller ,并且您可以轻松地看到你自己怎么了。

  2. 关于您询问的特定容器 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/

相关文章:

ios - cocos2d等轴测图教程

c - OpenCL:私有(private)内存的目的和有效用途是什么?

底部带有图标选择问题的 Android FragmentTabHost 选项卡

c - 在 C 中释放内存时出现段错误

c++ - C++ 中 sizeof 的行为

html - 悬停或事件时 HTML/CSS 选项卡出现问题

java - 如何在 Eclipse Java 中创建制表符分隔

javascript - 无法在Chrome v.71 iOS 12+上打开Blob文件

ios - 数组转换错误

ios - 在自动布局中隐藏和显示元素