你不能完全用C++编写Cocoa应用程序。 Cocoa 在其许多核心技术中(例如键值绑定、委托 (Cocoa 风格) 和目标-动作模式)严重依赖于 Objective-C 的后期绑定能力。这些后期绑定要求使得在像 C++ 这样的编译时绑定和类型化语言中实现 Cocoa API 变得非常困难ⁱ。当然,你可以编写在OS X上运行的纯C++应用程序。只是它不能使用Cocoa API。
因此,如果您想在其他平台上编写C++应用程序并与基于Cocoa的应用程序共享代码,则有两个选择。第一种是在C++中编写模型层,而在Cocoa中编写GUI。这是一种常见的方法,被一些非常大的应用程序(包括Mathematica)使用。可以不更改C++代码(您不需要在OS X上编写或编译C++的“时髦”苹果扩展)。你的控制器层可能会使用Objective-C ++ (也许是你提到的“时髦”苹果扩展)。Objective-C++ 是 C++ 的超集,就像 Objective-C 是 C 的超集一样。在 Objective-C++ 中,您可以从 C++ 函数中进行 objc 样式的消息传递调用(如 [some-objc-object callMethod];
)。反之,您可以在 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特定技术,例如核心动画和一些QuickTime功能,尽管在Qt API中有近似替代品。正如您指出的那样,Carbon将不会被移植到64位。由于Qt是基于Carbon API实现的,Trolltech/Nokia不得不将Qt移植到Cocoa API上,以使其在OS X上支持64位。我的理解是,Qt的下一个版本(目前处于
发布候选状态)将完成此转换,并在OS X上支持64位。如果您有兴趣将C++和Cocoa API集成起来,您可能需要查看Qt 4.5的源代码。
ⁱ 有一段时间,苹果公司将Cocoa API提供给Java使用,但是这个桥接需要大量手动调整,并且无法处理像上面描述的键值绑定等更高级技术。目前,像Python、Ruby等动态类型、运行时绑定的语言是编写没有Objective-C的Cocoa应用程序的唯一真正选择(虽然当然这些桥接在底层使用Objective-C)。