Objective-C ランタイム ライブラリを使用すると、開発者は、スローされた例外の catch 句が見つかった後、クリーンアップ フェーズで、システムがスタックを 2 回目にアンワインドしている間に、スタック フレームごとに呼び出される関数を指定できます。
そのため、Unwind ライブラリと ObjC 例外処理システムの両方に精通している場合__objc_personality_v0
、現在のスタック フレームの Unwind コンテキストに対して Objective-C パーソナリティ ルーチン ( ) が呼び出されると、ObjC システムはその代替ハンドラーがあるかどうかをチェックします。環境。alt ハンドラーが見つかった場合は、最初に呼び出されます。その後、ObjC 例外処理機構が C++ ABI を使用してスタックをアンワインドするため、cxx パーソナリティ関数 ( __gxx_personality_v0
) が呼び出されます。ただし、これは、検索フェーズではなく、クリーンアップ フェーズで objc パーソナリティ ルーチンが呼び出されている場合にのみ行われます。そのため、現在の例外の catch 句が見つからない場合、alt ハンドラーは呼び出されません。
ゼロ コストの部分については、cxx パーソナリティ関数はゼロ コストの例外処理を使用します。したがって、ランタイム ライブラリが alt ハンドラのサポートなしでコンパイルされている場合、__gxx_personality_v0
とにかく呼び出されるため、ゼロ コストの実装しかありません。
Objective-C ライブラリのパブリック API は、特定の Unwind Context の alt ハンドラーを追加および削除する 2 つの関数を提供します:それぞれobjc_addExceptionHandler
とobjc_removeExceptionHandler
。