1

http://opensource.apple.com/source/objc4/objc4-532.2/runtime/objc-exception.mmで、Apple の Objective-C ランタイムが__cxa_throw__cxa_begin_catch__cxa_end_catchなどの例外処理にいくつかの C++ ABI 関数を使用していることを見ました__cxa_rethrow。Objective-C での例外処理は C++ での例外処理と似ているため (C++ のパーソナリティ ルーチンでさえ Obj-C と同じです)、Objective-C ランタイム ライブラリでこれらの関数を使用するには、いくつかの調整のみが必要です。

したがって、私のポイントは、ランタイム チームが「必要ない」または「できない」(おそらく、Objective-C++ の場合、C++ との互換性を維持するため) 独自の ABI を実装する (たとえば、C++ ABI のように Unwind ライブラリを使用することによって) ということです。 )? objc_exception_throwobjc_exception_rethrow、 のobjc_begin_catchような関数は、C++ オブジェクトを処理する必要があるので、実際に行うように、、、およびを内部でobjc_end_catch使用できるようにするだけでなく、使用する必要がありますか?__cxa_throw__cxa_rethrow__cxa_begin_catch__cxa_end_catch

4

1 に答える 1

3

C++ 例外と Objective-C 例外の間の相互運用性を高めるために、Apple がこれらの C++ ABI 関数を使用することを選択したのではないかと思います。IIRC は、「最新の」Objective-C ランタイム (iOS および Mac OS X 64 ビットで利用可能) で、C++ は Objective-C の例外をキャッチでき、その逆も可能です。ランタイムの初期の化身ではそうではなく、同じアプリケーションで C++ と Objective-C コードを組み合わせるときに非常に厄介な問題が発生しました。

于 2013-02-06T04:12:30.300 に答える