您不能完全用C ++编写Cocoa应用程序。Cocoa的许多核心技术(例如键-值绑定,委托(Cocoa风格)和目标操作模式)在很大程度上依赖于Objective-C的后期绑定功能。后期绑定的要求,因此非常难以实现的约束编译时可可API,类型的语言,如C ++ⁱ。当然,您可以编写一个在OS X上运行的纯C ++应用程序。它不能使用Cocoa API。
因此,如果要在其他平台上的C ++应用程序和基于Cocoa的应用程序之间共享代码,则有两个选择。首先是用C ++编写模型层,并用Cocoa编写GUI。这是某些大型应用程序(包括Mathematica)使用的常见方法。您的C ++代码可以保持不变(您不需要“笨拙的” Apple扩展名即可在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做得非常好,但是,取决于受众和您的应用程序的使用,它可能已经足够好了。此外,尽管Qt API中有大约替代品,但您将失去某些OS X特定技术,例如Core Animation和某些QuickTime功能。如您所指出,Carbon将不会移植到64位。由于Qt是在Carbon API上实现的,因此Trolltech /诺基亚不得不将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)。