web-dev-qa-db-ja.com

C ++をObjective-Cプロジェクトに組み込むための最良の方法

今後のXCode iOSプロジェクトでは、Objective-Cでビューとビューコントローラーを作成する予定です。私のモデルはC++で提供されます。

Objective-CプロジェクトでC++を使用する2つの方法を知っています。以下に説明します。各方法の長所と短所は何ですか。他に推奨される方法はありますか?その長所と短所は何ですか?

-C++ヘッダーファイルでは、 Wikipedia の説明に従ってextern "C"宣言を使用します。

Rob Napier で説明されているObjective-C++でC++をラップする。

7
Ben Boral

フレームワークのため、ビューとビューコントローラーはObjective-Cである必要があります。これだけ与えられます。次に問題となるのは、C++コードとObjective-Cコードの橋渡しをする場所です。

まず、extern C {}リンカー規約を使用してC++コードをC関数にラップしないことをお勧めします。次に、2つの問題を与えました。C内からC++のクラスと型を処理する方法と、Objective-Cオブジェクト内から構造化Cインターフェースを使用する方法です。これらの問題はどちらも克服できますが、導入する必要がない場合もあります。

3つのアプローチが可能と思われます。

  • アプリケーションのロジックと動作をC++で記述します。特定のクラスには、フレームワークとインターフェースできるように、Objective-C型のメンバーフィールドがあります。このアプローチは、フレームワーク間で「インピーダンスの不一致」の問題にぶつかる可能性があります-「私たちを呼び出さないで、私たちはあなたに電話します」ポリシーを持ちます-アプリケーションの動作を外部から制御しようとする独自のコードフレームワークの範囲。

  • ビューコントローラーで、C++型への参照をインスタンス変数として保持します。ビューコントローラークラスはObjective-C++ファイルになります。

  • objective-C++でアダプタークラスまたはファサードクラスを記述して、Objective-C APIを提供し、C++型を内部的に管理します。ビューコントローラーは、このレイヤーを介してのみモデルにアクセスします。

これらのアプローチのうち、私は3番目を優先します。 「モデルの管理」(C++コード内)、「モデルコンテンツの表示」(ObjCビューコントローラクラス内)、および「C++からObjCへのブリッジング」(アダプタレイヤ内)の責任を分離します。 ObjCは知っているがC++は知らない多くの開発者に出会うでしょう。逆の場合も同様です。このアプローチにより、開発者があなたと協力して作業する場合でも、Webであなたを助けようとする場合でも、コードベースに貢献することが最も簡単になります。

7
user4051

Objective-Cについてはよく知りませんが、extern "C"アプローチは、C++ヘッダーファイルにC++クラスが含まれず、Cスタイルの構造体と関数のみが含まれる場合にのみ機能します。モデルがC++で記述されている場合、これは当てはまらないと思います。そのため、2つ目の方法を試す必要があると思います。

extern "C"はC++でCコードを使用することを意図しており、その逆は意図していません。

1
Doc Brown