自动释放池何时耗尽?

时间:2015-05-28 19:13:14

标签: ios objective-c memory-management

我研究手动内存管理,我想知道自动释放池何时耗尽。

我发现有三种情况: 1 - 在main.m中,从应用程序运行开始并在结束时排干,因此释放内存中的所有对象。 2 - 当您手动显式创建自动释放池并将其耗尽时

第三种情况是我要求的,对我来说有点混乱。

在我研究时,自动释放对象就像C中的自动变量一样,只存在于逻辑范围内(在函数体中)。因此,我认为在每个函数之后都有一个隐藏的[pool drain];

但是,有人向我指出,我认为它不正确。苹果公司表示,它会在#34;事件后消失。当用户点击按钮时,可能会发生该事件,例如重新加载表格视图。

但是这些信息还不足以看到整体情况。你可以向我澄清一下,当一个游泳池真正排出物体时,如NSArray *arr = [NSArray array];

2 个答案:

答案 0 :(得分:5)

文档并未具体说明" main" autorelease pool drains,但通常你可以假设它在应用程序的主要事件循环结束时被耗尽。

以下是关于自动释放池的情况:

  1. 应用程序启动时会创建自动释放池。
  2. 创建另一个池时,会将其添加到自动释放池堆栈的顶部。
  3. 当一个autorelease被发送到一个对象时,它被添加到堆栈顶部的自动释放池中。
  4. release被发送到自动释放池时,它会将release发送到池中的任何对象。
  5. #4通常在主事件循环结束时自动发生(对于主自动释放池)。

    NSAutoreleasePool的文档包含更多信息,包括此相关信息:

      

    Application Kit在事件循环的每个循环开始时在主线程上创建一个自动释放池,并在最后将其排出,从而释放处理事件时生成的任何自动释放的对象。

答案 1 :(得分:0)

当我使用逆向工程工具分析Foundation框架时。然后,我发现在runloop的开头创建了自动释放池,并在runloop的结尾释放了释放池。 图片:autorelease start at runloop