@autoreleasepool语义

ban*_*isa 7 objective-c llvm automatic-ref-counting

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

..尤其是@autoreleasepool.

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

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

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

小智 9

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

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

@autoreleasepool {
    …
    for (int i = 0; i < MAX; i++) {
        @autoreleasepool {
            …
        }
    }
    …
}
Run Code Online (Sandbox Code Playgroud)

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

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