iPhone:关于NSAutoreleasePool的困惑

时间:2011-11-17 09:53:15

标签: iphone objective-c nsautoreleasepool

我读到了有关NSAutoReleasePool的信息,并了解它使iPhone上的内存管理变得更容易。它在NSObject上可用,因此每个对象实例都可以使用自动释放消息。此外,我不应该使用autorelease很多,因为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 个答案:

答案 0 :(得分:3)

  

您可以使用本地自动释放池来帮助减少峰值内存   脚印。当您的池耗尽时,临时对象就是   释放,这通常导致他们的释放   减少程序的内存占用。

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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