首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@autoreleasepool语义

@autoreleasepool语义
EN

Stack Overflow用户
提问于 2011-10-18 16:55:11
回答 2查看 2.3K关注 0票数 7

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

..in详细介绍了@autoreleasepool。

在目前使用NSAutoreleasePool的许多实现中,我看到了在循环迭代期间定期排空池的情况-我们如何使用@autorelease池来做同样的事情,或者这都是在幕后为我们完成的?

其次,文档声明如果抛出异常,池不会被排空……ok异常在名称上是异常的,但如果它们确实发生了,您可能希望在不泄漏内存负载的情况下进行恢复。文档没有具体说明这些对象将在何时发布。

有谁有关于这些点的信息吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-18 17:04:06

在很多当前使用NSAutoreleasePool的实现中,我看到了在循环迭代期间周期性地排空池的情况-我们如何使用@autorelease池来做同样的事情,或者这都是在幕后为我们做的?

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

代码语言:javascript
复制
@autoreleasepool {
    …
    for (int i = 0; i < MAX; i++) {
        @autoreleasepool {
            …
        }
    }
    …
}

其次,文档声明如果抛出异常,池不会被排空……ok异常在名称上是异常的,但如果它们确实发生了,您可能希望在不泄漏内存负载的情况下进行恢复。文档没有具体说明这些对象将在何时发布。

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

票数 9
EN

Stack Overflow用户

发布于 2011-10-18 17:03:22

我们如何对@autorelease池执行相同的操作

如下所示:

代码语言:javascript
复制
for (int i = 0; i < 10000; i++) {
    @autoreleasepool {
        // Do your work here
        ...
    }
}

其次,文档声明如果抛出异常,池不会被排空……ok异常在名称上是异常的,但如果它们确实发生了,您可能希望在不泄漏内存负载的情况下进行恢复。

AFAIK这与ARC是不可能的。ARC根本不是异常安全的。如果发生异常,则存在不可恢复的内存泄漏的可能性。使用ARC的代码不应依赖异常进行错误报告。我们的预期是,当引发异常时,该进程无论如何都会崩溃。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7804696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档