首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@autorelease指令和异常处理

@autorelease指令和异常处理
EN

Stack Overflow用户
提问于 2011-12-12 20:49:15
回答 2查看 1.2K关注 0票数 2
代码语言:javascript
复制
- (void)foo
{
    @try {
         for (id o in os){
             @autoreleasepool {
                 for (id o2 in moreOs){
                       // create a lot of autoreleased objects.
                 }
                //exception raised
            }
        }

    }
    @catch (NSException *exception) {
     // handle the exception   
    }
}
  1. 如果出现异常,编译器会重写上面的代码来耗尽池,还是会泄漏?
  2. 如果编译器确实重写了它,它将如何进行重写?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-12 21:02:20

为了解决您的问题,在该池中创建的对象将不会被有效泄漏,直到堆栈中的某个自动释放池被耗尽为止。除了您的应用程序的主自动释放池之外,在堆栈的另一端可能没有池,这可能在一段时间内不会被耗尽。

如果捕捉到异常,请尝试以下操作,以强制在此方法返回时发生漏出。

代码语言:javascript
复制
- (void)foo
{
    @autoreleasepool {
        @try {
            for (id o in os){
                @autoreleasepool {
                    for (id o2 in moreOs){
                        // create a lot of autoreleased objects.
                    }
                    //exception raised
                }
            }

        }
        @catch (NSException *exception) {
            // handle the exception   
        }
    }
}

根据文档,当最外层的自动释放池被排出时,它也会排出所有嵌套的。

如果您排出一个不是堆栈顶部的自动释放池,则堆栈上的所有(未释放的)自动释放池都会被耗尽(并且它们的所有对象都发送了适当的发布消息)。如果在完成自动释放池(不推荐的内容)时,忽略了将排水池发送到自动释放池,则当其中一个自释放池中的嵌套池被排出时,该池就会被耗尽。

高级内存管理编程指南中的“自动释放池的范围及其嵌套自动释放池的含义”一节

票数 2
EN

Stack Overflow用户

发布于 2011-12-12 20:56:28

它将而不是排水池。来自过渡到ARC发行说明

进入时,会按下一个自动释放池。在正常出口(中断、返回、转到、通过等等),会弹出自动释放池。为了与现有代码兼容,如果退出是由于异常,则不会弹出自动释放池。

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

https://stackoverflow.com/questions/8480624

复制
相关文章

相似问题

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