iPhone:关于NSAutoreleasePool的困惑

iPhone:关于NSAutoreleasePool的困惑,iphone,objective-c,nsautoreleasepool,Iphone,Objective C,Nsautoreleasepool,我读过关于NSAutoReleasePool的书,了解到它使iPhone上的内存管理更容易。它在NSObject上可用,因此自动释放消息可用于每个对象实例。此外,我不应该经常使用自动释放,因为NSAutoReleasePool使用缓存,如果有大量自动释放的对象,可能会耗尽内存。我的理解正确吗 有一件事我不明白,像下面的方法那样显式创建NSAutoreleasePool的目的是什么?这里的目的是什么?这就像自动释放imgData、img对象一样吗?因为我可以看到这些对象并没有在这个方法中被释放 -

我读过关于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];
}

谢谢。

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

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

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

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

您可以使用本地自动释放池来帮助减少峰值内存 足迹。当池中的水排干时,临时对象将被移除 释放,这通常会导致其解除分配 减少程序的内存占用

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

您可以使用本地自动释放池来帮助减少峰值内存 足迹。当池中的水排干时,临时对象将被移除 释放,这通常会导致其解除分配 减少程序的内存占用


我建议创建这个显式自动释放池是为了管理图像加载。可能该映像的大小很大(Mb),并且该池可以保证尽快释放内存。所有自动释放池都组织在堆栈中,因此此内部池将比主池更早地排空。

哈哈哈,
Steve Jobs
帮助
AppleDeveloper
。。。fully.autorelease对象不会“仅在应用程序终止后才被释放”。当没有对象声明所有权并且它没有被使用时,它将被释放。我曾经有一个错误,当我从一个集合中移除对象时,自动释放释放释放了它。虽然它不是完全可预测的,它似乎是在线程不在代码中时释放的,但在我的bug中,它是在返回到另一个方法时释放的。是的,你是对的,一旦你退出特定循环,一些对象将被释放。铍元素已经解释得很清楚了,这是我想说的。(很抱歉搞混了。)哈哈哈,
SteveJobs
帮助
AppleDeveloper
。。。fully.autorelease对象不会“仅在应用程序终止后才被释放”。当没有对象声明所有权并且它没有被使用时,它将被释放。我曾经有一个错误,当我从一个集合中移除对象时,自动释放释放释放了它。虽然它不是完全可预测的,它似乎是在线程不在代码中时释放的,但在我的bug中,它是在返回到另一个方法时释放的。是的,你是对的,一旦你退出特定循环,一些对象将被释放。铍已经很清楚地解释了这一点,这是我想说的。(对混淆表示抱歉。)自动释放不仅仅用于线程。。正如上面所解释的,自动释放还有其他用途。自动释放不仅仅用于线程。。除上述说明外,还有其他用途。