不能完全用C++编写可可应用程序.Cocoa在很多核心技术上严重依赖Objective-C的后期绑定功能,比如键值绑定、委托(Cocoa风格)和目标操作模式.后期绑定要求使得在编译时绑定的类型化语言(如C++)中实现COCOA API是very的困难.ⁱ. 当然,你可以编写一个运行在OS X上的纯C++应用程序,它不能使用COCOA API.
因此,如果您想在其他平台上的C++应用程序和基于COCOA的应用程序之间共享代码,您有两种 Select .第一个是用C++编写模型层,在COCOA中编写GUI.这是一些非常大的应用程序常用的方法,包括Mathematica个.你的C++代码可以保持不变(你不需要"时髦"的苹果扩展来编写或编译C++在OS X上).您的控制器层可能会使用Objective-C++(可能是您提到的"时髦"苹果扩展).Objto-C++是C++的超集,就像ObjuleC是C的超集一样,在ObjuleC++中,可以从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语言guide中了解更多有关Objective-C++的信息.然后,视图层可以是纯Objective-C.
第二个 Select 是使用跨平台C++工具包.Qt个工具包可能符合要求.Mac用户通常鄙视跨平台工具包,因为它们没有完全正确地获得所有的外观和感觉细节,Mac用户希望Mac应用程序的UI更加完美.然而,Qt做得出人意料地好,根据用户和应用的使用情况,它可能已经足够好了.此外,您将失go 一些特定于OS X的技术,例如核心动画和一些QuickTime功能,尽管Qt API中有一些近似的替代品.正如你所指出的,Carbon 将不会被移植到64位.由于Qt是在Carbon API上实现的,Trolltech/Nokia不得不将Qt移植到Cocoa API,以使其64位兼容.我的理解是,QT的下一个版本(目前在release candiate)完成了这个转换,并且在OS X上是64位兼容的.如果您有兴趣集成C++和COCOA API,您可能需要查看QT 4.5的来源.
ⁱ 有一段时间,苹果公司向Java提供了Cocoa API,但该桥接器需要大量手动调整,无法处理更先进的技术,如上述键值绑定.目前,Python、Ruby等动态类型的、运行时绑定的语言是编写没有Objective-C的Cocoa应用程序的唯一真正 Select (当然,这些桥在后台使用Objective-C).