8

Mac用に移植する必要のあるネットワーク通信用のC++ライブラリがあります。以前は、このライブラリはWindowsC++アプリで使用されていました。

C ++ Network Libのフローは、エラーコードや最後のエラーを返すのではなく、エラーが発生した場合の例外に基づいています。

Macでは、アプリにObjective-C /C++を使用しています。Objective-C / C ++でUIを使用する必要がありますが、コアネットワーク機能に使用されるlibは同じC++libです。

だから私の質問は、ObjectiveCがC++呼び出しによってスローされた例外を処理できるかどうかです。もしそうなら、どのように?そうでない場合、どうすれば解決できますか?または、C ++ Lib呼び出しのラッパーを記述して、例外を消費し、エラーコードを返しますか?

それを解決する方法を教えてください。

4

1 に答える 1

7

iOSまたはOSXで64ビットランタイムを使用している場合は、ほとんど問題なく動作します。C++スタイルのtry/catchを記述でき、@ try /@catchと同様に期待どおりに機能します。Objective-CとC++の例外については、まだ2つの異なるスタイルがあることに注意してください。唯一の統合は、またはがすべての例外、Objective-CまたはC++をキャッチする特殊なケースです。これは、クリーンアップコードを一元化するのにわずかに役立ちますが、例外自体を除いてできることは、@throwitをもう一度盲目的に投げることだけです。catch(...)@catch(...)

ただし、いずれの場合も、 Objective-C (またはObjective-C ++)プログラムのフロー制御に例外を使用しないでください。実際、C ++例外が問題のライブラリを終了するときにトラップし、NSErrorなどのより適切なメカニズムに変換するように努める必要があります。特に、Appleやサードパーティのフレームワークを介してそれらのいずれかを発生させることは避けてください-そのようなフレームワークのほとんどは、C ++の例外はもちろん、Objective-Cの例外に対して例外安全ではないため、結果は未定義です(多くの場合、メモリリークを中心に展開していますが、他の障害が発生する可能性があります)。

于 2012-12-17T16:26:34.580 に答える