我研究手动内存管理,我想知道自动释放池何时耗尽。
我发现有三种情况:
1 - 在main.m
中,从应用程序运行开始并在结束时排干,因此释放内存中的所有对象。
2 - 当您手动显式创建自动释放池并将其耗尽时
第三种情况是我要求的,对我来说有点混乱。
在我研究时,自动释放对象就像C中的自动变量一样,只存在于逻辑范围内(在函数体中)。因此,我认为在每个函数之后都有一个隐藏的[pool drain];
但是,有人向我指出,我认为它不正确。苹果公司表示,它会在#34;事件后消失。当用户点击按钮时,可能会发生该事件,例如重新加载表格视图。
但是这些信息还不足以看到整体情况。你可以向我澄清一下,当一个游泳池真正排出物体时,如NSArray *arr = [NSArray array];
?
答案 0 :(得分:5)
文档并未具体说明" main" autorelease pool drains,但通常你可以假设它在应用程序的主要事件循环结束时被耗尽。
以下是关于自动释放池的情况:
autorelease
被发送到一个对象时,它被添加到堆栈顶部的自动释放池中。release
被发送到自动释放池时,它会将release
发送到池中的任何对象。#4通常在主事件循环结束时自动发生(对于主自动释放池)。
NSAutoreleasePool
的文档包含更多信息,包括此相关信息:
Application Kit在事件循环的每个循环开始时在主线程上创建一个自动释放池,并在最后将其排出,从而释放处理事件时生成的任何自动释放的对象。
答案 1 :(得分:0)
当我使用逆向工程工具分析Foundation框架时。然后,我发现在runloop的开头创建了自动释放池,并在runloop的结尾释放了释放池。 图片: