1. ホーム
  2. c++

[解決済み] CocoaでObjective-Cの代わりにC++を使う?

2022-07-19 05:47:24

質問

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 が使用されていますが)。