我读过关于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];
}谢谢。
发布于 2011-11-17 18:16:03
您可以使用本地自动释放池来帮助减少峰值内存占用。当您的池被排空时,临时对象会被释放,这通常会导致它们被释放,从而减少程序的内存占用。
我可以建议这个显式的自动释放池是为管理镜像加载而创建的。可能该镜像具有较大的大小(以Mb为单位),并且该池可以保证内存将被尽快释放。所有自动释放池都组织在堆栈中,因此此内部池将比主池更早耗尽。
发布于 2011-11-17 17:58:48
自动释放背后的想法是保持应用程序的低内存使用率。你看,如果你没有使用这个自动释放,那么这些数据就会进入应用程序的主要自动释放,所以即使你不再需要这个图像,它仍然会留在内存中,并增加其占用空间。创建一个新的自动释放会立即释放内存。(图像的大小可能很大。)
发布于 2011-11-17 18:03:34
规则是,您必须在将使用自动释放的每个线程中创建一个自动释放池。在您的示例中,img变量是自动释放的,并且假设loadImage方法是线程化的,那么在使用任何自动释放的内存之前,您必须声明一个新池。
https://stackoverflow.com/questions/8165134
复制相似问题