首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iPhone:对NSAutoreleasePool的困惑

iPhone:对NSAutoreleasePool的困惑
EN

Stack Overflow用户
提问于 2011-11-17 17:53:15
回答 3查看 167关注 0票数 0

我读过关于NSAutoReleasePool的文章,了解到它使iPhone上的内存管理变得更容易。它在NSObject上可用,因此自动释放消息可用于每个对象实例。此外,我不应该经常使用自动释放,因为NSAutoReleasePool使用缓存,如果有很多自动释放的对象,你可能会用完内存。我的理解正确吗?

我不明白的一件事是,像下面的方法那样显式地创建NSAutoreleasePool的目的是什么?这里的目的是什么?是不是就像自动释放imgData,img对象一样?因为我可以看到这些对象并没有在这个方法中被释放。

代码语言:javascript
复制
- (void)loadImage {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
UIImage *img = [UIImage imageNamed: @"default_user.png"];
if(![[imgURL absoluteString] isEqualToString: @"0"]) {
    NSData *imgData = [NSData dataWithContentsOfURL: imgURL];
    img = [UIImage imageWithData: imgData];
}
if([target respondsToSelector: action])
    [target performSelectorOnMainThread: action withObject: img waitUntilDone: YES];
[pool release];
}

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-17 18:16:03

您可以使用本地自动释放池来帮助减少峰值内存占用。当您的池被排空时,临时对象会被释放,这通常会导致它们被释放,从而减少程序的内存占用。

我可以建议这个显式的自动释放池是为管理镜像加载而创建的。可能该镜像具有较大的大小(以Mb为单位),并且该池可以保证内存将被尽快释放。所有自动释放池都组织在堆栈中,因此此内部池将比主池更早耗尽。

票数 3
EN

Stack Overflow用户

发布于 2011-11-17 17:58:48

自动释放背后的想法是保持应用程序的低内存使用率。你看,如果你没有使用这个自动释放,那么这些数据就会进入应用程序的主要自动释放,所以即使你不再需要这个图像,它仍然会留在内存中,并增加其占用空间。创建一个新的自动释放会立即释放内存。(图像的大小可能很大。)

票数 1
EN

Stack Overflow用户

发布于 2011-11-17 18:03:34

规则是,您必须在将使用自动释放的每个线程中创建一个自动释放池。在您的示例中,img变量是自动释放的,并且假设loadImage方法是线程化的,那么在使用任何自动释放的内存之前,您必须声明一个新池。

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

https://stackoverflow.com/questions/8165134

复制
相关文章

相似问题

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