您不能完全用 C++ 编写 Cocoa 应用程序。Cocoa 的许多核心技术都严重依赖于 Objective-C 的后期绑定功能,例如键值绑定、委托(Cocoa 风格)和目标动作模式。后期绑定要求使得在编译时绑定的类型化语言(如 C++ⁱ)中实现 Cocoa API变得非常困难。当然,您可以编写一个在 OS X 上运行的纯 C++ 应用程序。它只是不能使用 Cocoa API。
因此,如果您想在其他平台上的 C++ 应用程序和基于 Cocoa 的应用程序之间共享代码,您有两种选择。首先是用C++写模型层,用Cocoa写GUI。这是一些非常大的应用程序使用的常用方法,包括Mathematica。您的 C++ 代码可以保持不变(您不需要“时髦”的苹果扩展来在 OS X 上编写或编译 C++)。您的控制器层可能会使用 Objective-C++(也许是您所指的“时髦”Apple 扩展)。Objective-C++ 是 C++ 的超集,就像 Objective-C 是 C 的超集一样。在 Objective-C++ 中,您可以[some-objc-object callMethod];
在 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。
第二种选择是使用跨平台的 C++ 工具包。Qt _工具包可能符合要求。跨平台工具包通常受到 Mac 用户的鄙视,因为它们没有完全正确地获得所有外观和感觉细节,而 Mac 用户期望 Mac 应用程序的 UI 得到润色。然而,Qt 的表现出人意料地好,并且根据受众和应用程序的使用情况,它可能已经足够好了。此外,您将失去一些 OS X 特定的技术,例如 Core Animation 和一些 QuickTime 功能,尽管在 Qt API 中有近似的替代品。正如您所指出的,Carbon 不会被移植到 64 位。由于 Qt 是在 Carbon API 上实现的,因此 Trolltech/Nokia 不得不将 Qt 移植到 Cocoa API 以使其与 64 位兼容。我的理解是 Qt 的下一个版本(目前在发布候选) 完成了这个转换并且在 OS X 上是 64 位兼容的。如果你对集成 C++ 和 Cocoa API 感兴趣,你可能想看看 Qt 4.5 的源代码。
ⁱ 有一段时间,Apple 将 Cocoa API 提供给 Java,但该桥需要大量的手动调整,并且无法处理更高级的技术,例如上述键值绑定。目前,动态类型、运行时绑定的语言,如 Python、Ruby 等,是编写没有 Objective-C 的 Cocoa 应用程序的唯一真正选择(当然,这些桥在底层使用了 Objective-C)。