@autoreleasepool语义

时间:2011-10-18 08:55:11

标签: objective-c llvm automatic-ref-counting

我正在llvm网站上阅读ARC文档:http://clang.llvm.org/docs/AutomaticReferenceCounting.html#autoreleasepool

..特别是@autoreleasepool。

在使用NSAutoreleasePool的许多当前实现中,我看到在循环迭代期间池被定期耗尽的情况 - 我们如何使用@autorelease池执行相同的操作,或者是否已经在某种程度上为我们完成了?

其次,文档说明如果抛出异常,池就不会耗尽......好的例外是名称异常,但如果它们确实发生了,你可能希望恢复而不会泄漏大量内存。文档没有指定何时释放这些对象。

任何人都有关于这些要点的任何信息吗?

2 个答案:

答案 0 :(得分:9)

  

在使用NSAutoreleasePool的许多当前实现中,我看到在循环迭代期间池被定期耗尽的情况 - 我们如何使用@autorelease池执行相同的操作,或者是否已经在某种程度上为我们完成了?

以相同的方式,即通过级联自动释放池。例如:

@autoreleasepool {
    …
    for (int i = 0; i < MAX; i++) {
        @autoreleasepool {
            …
        }
    }
    …
}
  

其次,文档说明如果抛出异常,池就不会耗尽......好的例外是名称异常,但如果它们确实发生了,你可能希望恢复而不会泄漏大量内存。文档没有指定何时释放这些对象。

在大多数情况下,由于Cocoa中异常的特殊性,程序将无法正常恢复,因此我认为泄漏对象是一个较小的问题。如果由于异常而退出@autoreleasepool块,则只有在弹出其中一个封闭的自动释放池时才会释放相应的自动释放对象。但是,您当然可以在@try/@catch/@finally块中放置@autoreleasepool块以防止这种情况发生。

答案 1 :(得分:2)

  

我们如何对@autorelease pool

做同样的事情

像这样:

for (int i = 0; i < 10000; i++) {
    @autoreleasepool {
        // Do your work here
        ...
    }
}
  

其次,文档说明如果抛出异常,池就不会耗尽......好的例外是名称异常,但如果它们确实发生了,你可能希望恢复而不会泄漏大量内存。

AFAIK这是ARC无法做到的。 ARC根本不是例外。如果发生异常,则存在不可恢复的内存泄漏的可能性。使用ARC的代码不应该依赖于错误报告的异常。期望的是,当引发异常时,进程仍会崩溃。