2011-11-17 224 views
0

我阅读了关于NSAutoReleasePool的内容,并了解它使内存管理更容易在iPhone上进行。它在NSObject上可用,因此autorelease消息可用于每个对象实例。此外,我不应该使用autorelease很多,因为NSAutoReleasePool使用缓存内存,如果有大量的自动释放对象,你可能会跳出内存。我的理解是否正确?iPhone:关于NSAutoreleasePool的困惑

我不明白的一件事是明确创建NSAutoreleasePool的目的是什么?这里的目的是什么?它是否像自动释放imgData,img对象?因为我可以看到这些对象不是以这种方法发布的。

- (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]; 
} 

谢谢。

回答

3

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

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

+0

谢谢铍。我现在很清楚! – applefreak

1

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

+2

哈哈哈,'史蒂夫乔布斯'帮助'AppleDeveloper' ...好笑。 – LouwHopley

+1

autorelease对象不会“只有在应用程序终止后才会释放”。当没有对象声明所有权并且没有被使用时,它将被释放。我曾经有过一个bug,autorelease在我从对象中移除它时释放了我的对象。但它并不完全可以预测,它似乎在线程不在你的代码中时释放,但是在我的错误中它被释放,同时将它返回到另一个方法。 – Aberrant

+0

是的,你是对的,一旦你退出一个特定的循环,一些对象将被释放。铍已经非常清楚地解释了我想说的话(对不起,我很困惑) –

0

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

+0

autorelease不仅用于线程..还有其他用途以及上面解释。 –