[解決済み] CocoaでObjective-Cの代わりにC++を使う?
質問
Apple が Carbon を 64 ビット対応にしないため、C++ と Cocoa フレームワークを使用するアプリケーションを書きたいと思っています。C++ は、Linux と Windows ではかなりシンプルな実装ですが、Mac OS X では、Apple 固有の追加コード (Obj-C ラッパーなど) が必要なようです。また、間違っているかもしれませんが、Apple は開発者に C++ ではなく Objective-C で書くように強制しているようです。
私は、クロス プラットフォームを維持するのが簡単な、Mac 上でコードを書くためのパスを見つけようとしています。Linux/Windows 用に C++ でコードを書いてから、大部分を Objective-C で書き直さなければならないのは、非常に非効率的です。
将来にわたってサポートされ、Xcode でサポートされる C++ でコードを書く方法はありますか。また、もし可能であれば、Xcode で C++ と Objective-C を混在させるにはどうしたらよいでしょうか。ありがとうございます。
どのように解決するのですか?
Cocoaアプリケーションを完全にC++で記述することはできません。Cocoa は、Key-Value Bindings、デリゲート (Cocoa スタイル)、および target-action パターンなどの多くのコア テクノロジーについて Objective-C のレイト バインディング機能に大きく依存しています。レイトバインディングの要件により は非常に Cocoa APIをC++71のようなコンパイル時に型付けされる言語で実装することは困難です。もちろん、OS X で動作する純粋な C++ アプリケーションを書くことはできますが、Cocoa API を使用することはできません。
ですから、他のプラットフォーム上の C++ アプリと Cocoa ベースのアプリケーションの間でコードを共有したい場合、2 つのオプションがあります。1 つ目は、モデル層を C++ で書き、GUI を Cocoa で書くことです。これは、次のような非常に大規模なアプリケーションで使用される一般的なアプローチです。
Mathematica
. C++のコードは変更せずに済みます(OS XでC++を書いたりコンパイルしたりするのに,"funky" Appleの拡張機能は必要ありません).コントローラ層は、おそらくObjective-C++を使用することになるでしょう(おそらく、あなたが言うところの"funky" Appleの拡張機能)。Objective-C++は、Objective-CがCのスーパーセットであるように、C++のスーパーセットです。Objective-C++では、objcスタイルのメッセージパッシング呼び出し(例えば
[some-objc-object callMethod];
のような)Objcスタイルのメッセージパッシング呼び出しをC++関数の中から行うことができます。逆に、ObjCのコード内からC++の関数を次のように呼び出すことができます。
@interface MyClass {
MyCPPClass *cppInstance;
}
@end
@implementation MyClass
- (id)init {
if(self = [super init]) {
cppInstance = new MyCPPClass();
}
return self;
}
- (void) dealloc {
if(cppInstance != NULL) delete cppInstance;
[super dealloc];
}
- (void)callCpp {
cppInstance->SomeMethod();
}
@end
Objective-C++の詳細については、Objective-C言語において 案内 . そして、ビュー層は純粋なObjective-Cとすることができます。
2つ目の選択肢は、クロスプラットフォームなC++ツールキットを使用することです。これは Qt ツールキットがそれにあたります。クロスプラットフォーム ツールキットは、すべてのルック アンド フィールの詳細を正確に把握しているわけではなく、Mac ユーザーは Mac アプリケーションの UI に洗練さを求めるため、一般に Mac ユーザーには嫌われています。しかし、Qt は驚くほど良い仕事をしており、利用者やアプリケーションの用途によっては、これで十分な場合もあります。また、Core AnimationやQuickTimeの機能など、OS X特有の技術は失われますが、Qt APIでおおよその代替が可能です。ご指摘の通り、Carbonは64bitに移植されません。QtはCarbonのAPIで実装されているため、Trolltech/NokiaはQtをCocoa APIに移植して64ビット対応にする必要がありました。私の理解では、Qt の次のリリース(現在 リリース候補 C++ と Cocoa API の統合に興味があるなら、Qt 4.5 のソースを見てみるとよいでしょう。
ⁱ しばらくの間、Apple は Cocoa API を Java で利用できるようにしましたが、ブリッジには大規模なハンドチューニングが必要で、上記の Key-Value Bindings のようなより高度な技術を扱うことはできませんでした。現在では、Python、Ruby などの動的型付けされた実行時結合言語が、Objective-C なしで Cocoa アプリを書くための唯一の現実的な選択肢です (もちろん、これらのブリッジでは Objective-C が使用されていますが)。
関連
-
[解決済み] Objective-CでNSStringsを連結するためのショートカット集
-
[解決済み] Objective-Cの定数
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] 仮想デストラクタはいつ使うのか?
-
[解決済み] Objective-Cで、ある文字列が他の文字列を含んでいるかどうかを調べるにはどうすればよいですか?
-
[解決済み] Objective-Cのtypedef enumとは何ですか?
-
[解決済み] SwiftからObjective-Cのコードを呼び出すにはどうしたらいいですか?
-
[解決済み] Objective-Cでデリゲートを作成するにはどうしたらいいですか?
-
[解決済み] objective-c/cocoaで例外を投げる
-
[解決済み】Objective-Cのコードをユニットテストするのに最適な方法は何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] テスト
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み】エラー:free(): 次のサイズが無効です(fast)。
-
[解決済み】Enterキーを押して続行する
-
[解決済み】Visual Studioのデバッガーエラー。プログラムを開始できません 指定されたファイルが見つかりません