Objective-C中的自动释放池 – 释放主要的AutoreleasePool?

根据我的理解,当一个对象被发送一个autorelease消息时,如果除main.m之外的其他自动释放池不存在,则该对象被放置在main.m中的一个。 假设这是正确的,我有几个问题:

1)是否所有的自动释放对象都停留在该池中,直到应用程序终止?

2)如果1是真的,是否创build一个没有本地自动释放池的自动释放对象(因此将该对象放在main.m池中)将该对象保存在内存中,直到应用程序终止或接收到内存警告为止?

3)什么时候main.m autorelease池耗尽,除了当应用程序收到内存警告或应用程序被终止?

例如,在这样的cellForRowAtIndexPath委托方法中:

 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Foobar"]; if (cell == nil) { // No cell to reuse => create a new one cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"Foobar"] autorelease]; // lots of custom stuff } return cell; 

细胞何时真的被释放? 他们必须自动发放,因为在你退还之前你不能释放他们,之后你也不能释放他们,因为他们超出了范围。 根据我目前的理解,这些单元格被放置在最顶层的自动释放池中,并在该池被排空/释放时被释放。 在这种情况下,这将是应用程序中唯一的自动释放池; main的一个。

4)这个问题,即使我已经完成了这些细胞和视图控制器已经释放,细胞留在记忆中,是吗? 如果情况并非如此,那么有人能够解释这种情况下的内存pipe理是如何工作的吗? 谢谢!

注意:我已经查看了苹果的文档,但主要讨论了何时使用自己的本地autorelease池,但没有太多关于它们如何实际运作。

1)是否所有的自动释放对象都停留在该池中,直到应用程序终止?

根据定义,自动释放对象由其自动释放池拥有,直到该池被耗尽。 将-autorelease发送给对象时,该对象将添加到池将在稍后释放的对象列表中。 自动释放池被组织在一个堆栈中,堆栈顶部的池是任何发送了对象的对象所添加的池。 在main()创build的池通常不是堆栈顶部的池。 例如,运行循环将在每次迭代开始时创build一个自动释放池。

2)如果1是真的,是否创build一个没有本地自动释放池的自动释放对象(因此将该对象放在main.m池中)将该对象保存在内存中,直到应用程序终止或接收到内存警告为止?

如果在main()中创build的池是最顶层的池,但是如上所述,通常情况并非如此。

3)什么时候main.m autorelease池耗尽,除了当应用程序收到内存警告或应用程序被终止?

main()创build的池和任何其他autorelease池没有区别。 当池被释放时,它们全部被耗尽,或者如果使用@autorelease指令,则在块的@autorelease

从文档 :

应用程序工具包在事件循环的每个循环的开始处的主线程上创build一个自动释放池,并在最后消耗它,从而释放处理事件时生成的任何自动释放对象。 如果您使用应用程序工具包,则通常不需要创build自己的池。 如果您的应用程序在事件循环中创build了大量临时自动发布的对象,那么创build“本地”自动释放池以帮助最大限度地减less峰值内存占用可能是有益的。

所以,默认池中的自动释放对象只能在当前事件的持续时间内存活。