在大多数情况下,对于ARC(自动引用计数),我们根本不需要考虑使用Objective-C对象进行内存管理。不再创建NSAutoreleasePool
,但是有一个新语法:
@autoreleasepool {
…
}
我的问题是,当我不应该手动释放/自动释放时,为什么会需要这个?
编辑:总结一下我从所有答案和评论中得出的结论:
新语法:
@autoreleasepool { … }
是的新语法NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
…
[pool drain];
更重要的是:
autorelease
和release
。 @autoreleasepool
:myRunLoop(…) { @autoreleasepool { … } return success; }
。 最佳答案
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
以及它如何引入作用域来推断有关保留,发布和自动发布内容的信息。