Cocoaアプリケーションを完全にC ++で作成することはできません。Cocoaは、キーと値のバインディング、デリゲート(Cocoaスタイル)、ターゲットアクションパターンなどのコアテクノロジの多くについて、Objective-Cのレイトバインディング機能に大きく依存しています。レイトバインディングの要件により、C ++ⁱのようなコンパイル時のバインドされた型付き言語でCocoa APIを実装することが非常に困難になっています。もちろん、OS Xで実行される純粋なC ++アプリを作成することもできます。CocoaAPIを使用することはできません。
したがって、他のプラットフォームのC ++アプリとCocoaベースのアプリケーションの間でコードを共有する場合は、2つのオプションがあります。1つ目は、モデルレイヤーをC ++で作成し、GUIをCocoaで作成することです。これは、Mathematicaを含むいくつかの非常に大きなアプリで使用される一般的なアプローチです。C ++コードを変更せずにそのままにしておくことができます(OS XでC ++を記述またはコンパイルするための「ファンキー」なApple拡張機能は必要ありません)。コントローラー層は、おそらくObjective-C ++を利用するでしょう(おそらく、あなたが参照する「ファンキーな」Apple拡張機能です)。Objective-CがC ++のスーパーセットであるのと同様に、Objective-C ++はC ++のスーパーセットです。Objective- [some-objc-object callMethod];
C++では、C ++関数内からobjcスタイルのメッセージ受け渡し呼び出し(など)を実行できます。逆に、次のような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は驚くほど良い仕事をしますが、オーディエンスとアプリの使用状況によっては、それで十分かもしれません。さらに、Qt APIにはおおよその代替品がありますが、Core Animationや一部のQuickTime機能などの一部のOS X固有のテクノロジーが失われます。ご指摘のとおり、Carbonは64ビットに移植されません。QtはCarbon APIに実装されているため、Trolltech / NokiaはQtをCocoa APIに移植して64ビット互換にする必要がありました。私の理解は、Qtの次のリリース(現在リリース候補中))はこの移行を完了し、OS Xで64ビット互換です。C++とCocoa APIの統合に関心がある場合は、Qt 4.5のソースを確認することをお勧めします。
Appleしばらくの間、AppleはCocoa APIをJavaで使用できるようにしましたが、ブリッジは広範な手動調整を必要とし、上記のキー値バインディングなどのより高度なテクノロジーを処理できませんでした。現在動的に型付けされている、Python、Rubyなどのランタイムバインド言語は、Objective-CなしでCocoaアプリを作成するための唯一の実際のオプションです(もちろん、これらのブリッジは内部でObjective-Cを使用しています)。