iOS何时分配内存和释放内存?(关于导航和选项卡控制器的默认行为)

iOS何时分配内存和释放内存?(关于导航和选项卡控制器的默认行为),ios,memory,tabs,navigation,master-detail,Ios,Memory,Tabs,Navigation,Master Detail,我刚开始为iOS开发。我已经看过很多关于以编程方式控制内存管理的文档,但是我对iOS在以下两者之间导航时处理内存的默认方式感到好奇: 标签 主详图视图 带有选项卡的主详图视图 (注意:当我说主详细视图时,我基本上是指导航控制器。我只是称之为“主详细视图”,以定义导航控制器层次结构的两个不同级别,因此我们更容易讨论) 我将用我的问题逐一介绍这3个主题: 选项卡 当应用程序首次启动时,它是将每个选项卡的所有数据加载到RAM中,还是只加载最初显示的选项卡的数据 如果1的答案是否:无论何时从一个选项

我刚开始为iOS开发。我已经看过很多关于以编程方式控制内存管理的文档,但是我对iOS在以下两者之间导航时处理内存的默认方式感到好奇:

  • 标签
  • 主详图视图
  • 带有选项卡的主详图视图
(注意:当我说主详细视图时,我基本上是指导航控制器。我只是称之为“主详细视图”,以定义导航控制器层次结构的两个不同级别,因此我们更容易讨论)

我将用我的问题逐一介绍这3个主题:

选项卡

  • 当应用程序首次启动时,它是将每个选项卡的所有数据加载到RAM中,还是只加载最初显示的选项卡的数据
  • 如果1的答案是否:无论何时从一个选项卡切换到另一个选项卡,它是否会取消分配从中切换的选项卡的数据
  • 如果对1的回答是“是”:如果应用程序需要在其每个选项卡中从数据库加载数据:它是否只将用户界面/本地功能加载到RAM中,并且仅在选择该选项卡时从数据库加载数据(当需要此数据时)
  • 主控细节视图(如果主控是UITableViewController,而细节只是UIViewController,并且它们嵌入到导航控制器中)

  • 加载局部视图后,返回主视图时,局部视图中的数据是否仍保留在RAM中
  • 当您加载一个局部视图,然后返回主视图,然后进入另一个局部视图时,第一个局部视图的数据是否保留在RAM中
  • 主控带选项卡的详细视图(如果主控是UITableViewController,而详细视图只是UIViewController,并且它们嵌入到导航控制器中)

  • 当您加载详图视图,然后切换到其他选项卡时,详图视图的数据是否仍在RAM中
  • 加载详图视图后,返回其主视图,然后切换选项卡,详图视图中的数据是否仍在RAM中
  • 所有这些问题都与iOS的默认行为有关。

    一些想法:

  • 诊断:最简单的诊断方法是将日志语句添加到子视图控制器中。例如,如果您将以下行添加到
    viewdiload
    dealloc
    方法中,您将作为控制器收到通知并加载和解除分配:

    NSLog(@"%s", __FUNCTION__);
    
    然后,通过在实例化和释放视图控制器时进行日志记录的视图控制器,您可以在容器控制器(选项卡栏控制器、导航控制器、拆分视图控制器等)的任意组合中使用这些控制器,并且您可以很容易地看到发生了什么

  • 关于您询问的特定容器控制器:

    • 选项卡栏控制器:在故事板中,选项卡栏控制器在您选择其各自选项卡(而不是之前)时分配子控制器,但保留旧选项卡。(在NIBs中,这取决于您以编程方式执行的操作;您可以预加载它们,也可以不预加载它们。)

    • 导航控制器:导航控制器在推送到特定场景时加载新的子控制器,但在该过程中不会释放以前的视图控制器。只有当从导航堆栈中弹出视图控制器时,该控制器才会被释放

    • 分割视图控制器:在分割视图控制器中执行替换序列时,它将实例化新的子场景,并释放以前的子控制器。如果之前的子控制器本身是一个容器控制器,比如选项卡或导航控制器,那么它的子控制器也将被释放


  • 如果你真的想知道,就用仪器来观察记忆。您可以确切地看到什么时候分配了内容,什么时候修改了保留计数,以及修改了什么。通常我不在乎,除非我的应用在开发过程中收到内存警告,或者我怀疑有泄漏(ARC有时也会发生)。顺便说一句,如果你不是,你应该使用ARC