3

重複の可能性:
Objective-cに戻った後、最終的にコードが実行されますか?

ObjectiveCの擬似コードの次のブロックについて考えてみます。

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によって次に高い例外ハンドラーが呼び出される前に実行されます。

この場合のメモリ管理の詳細については、リンクされたドキュメントページの一番下を参照してください。あなたの例では「OK」です。これは、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 に答える