我想编写使用C++和COCOA框架的应用程序,因为苹果没有制造64位的Carbon .C++在Linux和Windows上的实现似乎很香草,但是在Mac OS X上,似乎需要额外的苹果专用代码(比如Obj-C包装器).似乎苹果也迫使开发者写在Objto-C而不是C++,虽然我可能错了.

我正试图找到一种在Mac上编写代码的方法,这种方法很容易跨平台编写.必须在C++中为Linux/Windows编写代码,然后在ObjtoE-C中重写大量的部分,这将是非常低效的.

有没有一种方法可以在将来支持C++中编写代码并在XCODE中支持?另外,如果这是可能的,我将如何在XCODE中混合C++和Objtovi-C?谢谢

推荐答案

不能完全用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).

Objective-c相关问答推荐

Objective c 判断文本字段是否为空

viewWillAppear,viewDidAppear 没有被调用,没有触发

我应该为 memcpy 和 realloc 包含什么标题?

CoreData:错误:无法在 NSManagedObject 类上调用指定的初始化程序

协议与类别

如何追踪 SIGABRT 的原因

Objective C for循环中断并继续

获取按其各自值排序的 NSDictionary 键

反编译 Objective-C 库

我们可以在 UIPageViewController 中自定义页面指示器吗?

在 iPhone 上测量人体胀气( Human-Flatulence)传播波包

如何将 NSNumber 转换和比较为 BOOL?

主队列上的 dispatch_sync 与 dispatch_async

Xcode 在您的 keys 串中找不到此配置文件的有效私有证书/有效密钥对

带有 NSBlockOperation 和队列的 NSURLSession

嵌入自定义容器视图控制器时,内容位于导航栏下方.

Highlighted 和 Selected UIButton 的 State 有什么区别?

在 iOS 7 上运行应用程序时显示黑条(4 英寸视网膜显示屏)

如何判断 NSString 的最后一个字符

无法从其 DataSource 获取单元格