3

可能重复:
在objective-c中返回后,代码最终会运行吗?

考虑这个Objective C伪代码块:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

@try {
    throw [[NSException alloc] init];
}
@catch (NSException *e) {
    throw e;
}
@finally {
    [pool drain];
}

游泳池会被排干吗?还是块throw中的@catch使该代码无法访问?我觉得游泳池应该被排干,但我无法以一种或另一种方式找到有关它的文档。

是的,我可以编写一些代码并对其进行测试,但目前这是不可行的。

谢谢

4

2 回答 2

3

是的(文档)

与本地@catch 异常处理程序关联的@finally 块在@throw 导致调用下一个更高的异常处理程序之前执行。

在这种情况下,有关内存管理的进一步说明,请参阅链接文档页面的最底部。你在你的例子中是“好的”,因为异常本身并没有作为你在 finally 块中耗尽的池的一部分自动释放。但是如果没有人释放它,您可能会泄漏该异常。

(但在某些情况下,异常生命周期似乎有些模糊,请参阅:@catch 块中捕获的对象的生命周期是什么?

于 2012-12-28T23:37:49.050 回答
2

来自https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Exceptions/Tasks/HandlingExceptions.html

@finally — Defines a block of related code that is subsequently executed whether an exception is thrown or not.

但它没有说明 catch 块中的异常。这听起来合乎逻辑,这个例外不会被咳嗽。

我制作了简单的程序来检查:

import <Foundation/Foundation.h>

int main(int argc, char **argv)
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init] ;

    int result = 0  ;

    @try {
            @throw [NSException exceptionWithName:@"Exception" reason:@"@try" userInfo:nil];
    }
    @catch (id exception) {
            @throw [NSException exceptionWithName:@"Exception" reason:@"@catch" userInfo:nil];
    }
    @finally {
            NSLog(@"Finally");
    }

    [pool release]  ;
    return result   ;
}

只需编译并执行:

$ gcc -framework Foundation -fobjc-exceptions test.m
$ ./a.out 
2012-12-29 00:39:21.667 a.out[86205:707] *** Terminating app due to uncaught exception 'Exception', reason: '@catch'
*** First throw call stack:
(
    0   CoreFoundation                      0x00007fff8e3050a6 __exceptionPreprocess + 198
    1   libobjc.A.dylib                     0x00007fff8e56e3f0 objc_exception_throw + 43
    2   a.out                               0x0000000107d48d47 main + 359
    3   libdyld.dylib                       0x00007fff90b4e7e1 start + 0
)
libc++abi.dylib: terminate called throwing an exception
Abort trap: 6
于 2012-12-28T23:28:00.330 回答