Advanced Memory Management Programming Guide关于@autoreleasepool说:

使用本地自动释放池块减少峰值内存占用量

许多程序创建自动释放的临时对象。这些
对象会增加程序的内存占用量,直到
块。在许多情况下,允许临时物体堆积
直到当前事件循环迭代的结束不会导致
过多的开销;在某些情况下,您可以创建一个
大量大量添加到内存中的临时对象
足迹,并且您希望更快地处理。在这些
对于后一种情况,您可以创建自己的自动释放池块。在
块的末尾,临时对象被释放,通常
导致它们的重新分配,从而减少了程序的内存
脚印。

以下示例显示了如何使用本地自动释放池
在for循环中阻塞。

NSArray *urls = <# An array of file URLs #>;
for (NSURL *url in urls) {

    @autoreleasepool {
        NSError *error;
        NSString *fileContents = [NSString stringWithContentsOfURL:url
                                         encoding:NSUTF8StringEncoding error:&error];
        /* Process the string, creating and autoreleasing more objects. */
    }
}

是否可以在没有autoreleasepool的情况下编写这些代码并对其进行有效管理?

例如创建property of fileContents并在处理后将其设置为nil
self.filecontents = nil;

最佳答案

问题在于stringWithContentsOfURL可以返回一个自动释放的对象。但是你可以使用
改为initWithContentsOfURL:

NSArray *urls = <# An array of file URLs #>;
for (NSURL *url in urls) {
    NSError *error;
    NSString *fileContents = [[NSString alloc] initWithContentsOfURL:url
                                     encoding:NSUTF8StringEncoding error:&error];
    /* Process the string ... */
    fileContents = nil;
}
init...方法返回保留的对象(+1),而不是自动释放的对象,因此fileContents = nil释放对象并销毁它(如果没有其他对象
对它的强引用)。

当然,只有在“字符串处理代码”不产生时,这才有帮助
其他自动释放的对象。 (如果设置了error,则会自动发布
目的。)

(实际上stringWithContentsOfURL不能自动保证会返回自动发布的内容
目的。特别是在发布模式下,ARC编译器删除了许多不必要的内容
保留/自动释放/释放操作。)

我不知道建立本地自动释放池是否是一项昂贵的操作
(我认为不是)。如果您在循环中处理许多对象,而您不知道
确切地说是否创建了自动发布的对象,这可能是明智的
只使用本地自动释放池,而不必关心它。
使用“仪器”进行分析也可以提供更多的见解。

有关更多信息,请参见“保留的返回值”和“未保留的返回值”
Clang ARC documentation中。

关于ios - 需要有关@autoreleasepool的帮助,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18170163/

10-12 00:27