首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Objective-C - release main AutoreleasePool中的自动释放池?

Objective-C - release main AutoreleasePool中的自动释放池?
EN

Stack Overflow用户
提问于 2011-12-18 11:55:45
回答 2查看 2.9K关注 0票数 7

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

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

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

3)除应用收到内存警告或应用终止外,main.m自动释放池何时耗尽?

例如,在如下所示的cellForRowAtIndexPath委托方法中:

代码语言:javascript
复制
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)这样做的问题是,即使我完成了这些单元格,并且释放了视图控制器,这些单元格仍然留在内存中,对吗?如果不是这样,有人能解释一下这种情况下的内存管理是如何工作的吗?谢谢!

注意:我看过Apple的文档,但它主要讨论了何时使用您自己的本地自动释放池,但没有太多关于它们实际如何工作的内容。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-18 12:56:41

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

根据定义,自动释放的对象归其自动释放池所有,直到该池被排出。当您向对象发送-autorelease时,该对象将被添加到池稍后将释放的对象列表中。自动释放池在堆栈中进行组织,堆栈顶部的池是向其中添加任何发送-autorelease的对象的池。在main()中创建的池通常不是堆栈顶部的池。例如,run循环将在每次迭代开始时创建一个自动释放池。

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

如果在main()中创建的池是最顶层的池,就会出现这种情况,但如上所述,通常情况并非如此。

3)除应用程序收到内存警告或应用程序终止外,main.m自动释放池何时耗尽?

main()中创建的池与任何其他自动释放池没有区别。在释放池时,它们都会被排空,如果使用@autorelease指令,则会在块的末尾排空它们。

票数 6
EN

Stack Overflow用户

发布于 2011-12-18 12:16:24

documentation

应用程序工具包在事件循环的每个周期开始时在主线程上创建一个自动释放池,并在结束时排出该池,从而释放在处理事件时生成的任何自动释放的对象。如果您使用应用程序工具包,则通常不必创建自己的池。但是,如果您的应用程序在事件循环中创建了大量临时的自动释放对象,那么创建“本地”自动释放池可能会有助于最小化峰值内存占用。

因此,默认池中的自动释放对象将仅在当前事件的持续时间内存活。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8549711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档