在大多数情况下,对于ARC(自动引用计数),我们根本不需要考虑使用Objective-C对象进行内存管理。不再创建NSAutoreleasePool,但是有一个新语法:

@autoreleasepool {
    …
}

我的问题是,当我不应该手动释放/自动释放时,为什么会需要这个?

编辑:总结一下我从所有答案和评论中得出的结论:

新语法:
@autoreleasepool { … }是的新语法
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
…
[pool drain];

更重要的是:
  • ARC使用autoreleaserelease
  • 它需要一个自动释放池。
  • ARC不会为您创建自动发布池。然而:
  • 每个Cocoa应用程序的主线程中已经有一个自动释放池。
  • 在两种情况下,您可能想使用@autoreleasepool:
  • 当您处于辅助线程中并且没有自动释放池时,必须自己制作以防止泄漏,例如myRunLoop(…) { @autoreleasepool { … } return success; }
  • 当您希望创建更多本地池时,如@mattjgalloway在其答案中所示。
  • 最佳答案

    ARC不会摆脱保留,发布和自动发布,它只是为您添加了必需的内容。因此,仍然有保留的调用,仍然有释放的调用,仍然有自动释放的调用,以及仍然有自动释放池。

    他们使用新的Clang 3.0编译器和ARC进行的其他更改之一是,他们用NSAutoReleasePool编译器指令替换了@autoreleasepool。无论如何,NSAutoReleasePool总是有点特殊的“对象”,他们做到了这一点,因此使用对象的语法不会与对象混淆,因此它通常更简单一些。

    因此,基本上,您需要@autoreleasepool,因为仍然需要担心自动发布池。您只需要担心添加autorelease调用即可。

    使用自动释放池的示例:

    - (void)useALoadOfNumbers {
        for (int j = 0; j < 10000; ++j) {
            @autoreleasepool {
                for (int i = 0; i < 10000; ++i) {
                    NSNumber *number = [NSNumber numberWithInt:(i+j)];
                    NSLog(@"number = %p", number);
                }
            }
        }
    }
    

    当然,这是一个非常人为设计的示例,但是,如果外部@autoreleasepool -loop中没有for,那么以后将释放100000000个对象,而不是每次在外部for -loop中释放10000个对象。

    更新:
    另请参阅此答案https://stackoverflow.com/a/7950636/1068248,以了解@autoreleasepool与ARC无关的原因。

    更新:
    我研究了这里和wrote it up on my blog的内部情况。如果在那里看一眼,那么您将确切地了解ARC在做什么,以及编译器如何使用新样式@autoreleasepool以及它如何引入作用域来推断有关保留,发布和自动发布内容的信息。

    10-08 07:46