繁体   English   中英

iPhone:关于NSAutoreleasePool的困惑

[英]iPhone: Confusion about NSAutoreleasePool

我阅读了有关NSAutoReleasePool的信息,并了解它使iPhone上的内存管理更加容易。 它在NSObject上可用,因此自动释放消息可用于每个对象实例。 而且,我不应该过多地使用自动释放,因为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];
}

谢谢。

您可以使用本地自动释放池来帮助减少峰值内存占用。 当池耗尽时,将释放临时对象,这通常会导致它们的重新分配,从而减少程序的内存占用量。

我可以建议创建此显式自动释放池来管理图像加载。 图像可能很大(以Mb为单位),并且该池可以保证内存将尽快释放。 所有自动释放池按堆栈组织,因此该内部池将比主池更早耗尽。

自动发布背后的想法是保持应用程序的内存使用率较低。 您会看到是否尚未使用此自动发布,则该数据将进入应用程序的主要自动发布,因此,即使您不再需要该映像,它仍会保留在内存中并增加其占用空间。 创建新的自动发布会立即释放内存(图像的大小可能很大。)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM