使用C + +而不是Objective-C?

我想编写使用C ++和Cocoa框架的应用程序,因为Apple不支持Carbon 64位。 C ++似乎是在Linux和Windows上实现的相当漂亮,但在Mac OS X上,似乎需要额外的Apple特定代码片段(如Obj-C包装器)。 也似乎苹果迫使开发人员写Objective-C而不是C ++,虽然我可能是错的。

我试图find在Mac上编写代码的path,这将很容易保持跨平台。 不得不在Linux / Windows的C ++中编写代码,然后在Objective-C中重写大部分代码将是非常低效的。

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

你不能完全用C ++编写一个Cocoa应用程序。 Cocoa在很大程度上依赖于Objective-C的许多核心技术的后期绑定function,例如键值绑定,代表(cocoa风格)和目标操作模式。 后期的绑定需求使得Cocoa API在像C ++这样的编译时绑定的types语言中很难实现。 当然,您可以编写一个在OS X上运行的纯C ++应用程序。它不能使用Cocoa API。

所以,如果你想在其他平台上的C ++应用程序和基于Cocoa的应用程序之间共享代码,你有两个select。 首先是在C ++中编写模型层,在Cocoa中编写GUI。 这是一些非常大的应用程序(包括Mathematica)使用的常用方法。 你的C ++代码可以保持不变(你不需要“时髦”的苹果扩展来在OS X上编写或编译C ++)。 您的控制器层可能会使用Objective-C ++(也许是您引用的“时髦”的Apple扩展)。 Objective-C ++是C ++的超集,就像Objective-C是C的超集一样。在Objective-C ++中,可以从C ++中使用objc风格的消息传递调用(如[some-objc-object callMethod]; )function。 相反,您可以从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语言指南中find有关Objective-C ++的更多信息。 视图层可以是纯粹的Objective-C。

第二个select是使用跨平台的C ++工具包。 Qt工具包可能适合这个账单。 Mac用户普遍鄙视跨平台的工具包,因为他们不能完全正确地获得所有的外观和感觉细节,Mac用户希望在Mac应用程序的用户界面上有光泽。 然而,Qt做得非常出色,根据观众和应用程序的使用情况,这可能就足够了。 另外,你将会失去一些特定于OS X的技术,比如核心animation(Core Animation)和一些QuickTimefunction,尽pipe在Qt API中有大致的替代。 正如你指出的那样,Carbon不会被移植到64位。 由于Qt是在Carbon API上实现的,因此Trolltech / Nokia必须将Qt移植到Cocoa API才能兼容64位。 我的理解是,Qt的下一个版本(目前正在发布中 )完成了这个转换,并且在OS X上是64位兼容的。如果你有兴趣集成C ++和cocoaAPI。


ⁱ有一段时间,苹果公司向Java提供了Cocoa API,但是这个桥梁需要大量的手动调整,并且无法处理更高级的技术,例如上述的键值绑定。 目前,dynamictypes化的,像Python,Ruby等运行时绑定的语言是编写Cocoa应用程序而不使用Objective-C的唯一真正的select(当然这些桥梁在底层使用Objective-C)。

好吧,听起来可能很愚蠢,但实际上我们可以编写纯粹的C ++代码来为Mac OS X创buildGUI,但是我们必须链接到Cocoa框架。

 /* * test1.cpp * This program shows how to access Cocoa GUI from pure C/C++ * and build a truly functional GUI application (although very simple). * * Compile using: * g++ -framework Cocoa -o test1 test1.cpp * * that will output 'test1' binary. */ #include <CoreFoundation/CoreFoundation.h> #include <objc/objc.h> #include <objc/objc-runtime.h> #include <iostream> extern "C" int NSRunAlertPanel(CFStringRef strTitle, CFStringRef strMsg, CFStringRef strButton1, CFStringRef strButton2, CFStringRef strButton3, ...); int main(int argc, char** argv) { id app = NULL; id pool = (id)objc_getClass("NSAutoreleasePool"); if (!pool) { std::cerr << "Unable to get NSAutoreleasePool!\nAborting\n"; return -1; } pool = objc_msgSend(pool, sel_registerName("alloc")); if (!pool) { std::cerr << "Unable to create NSAutoreleasePool...\nAborting...\n"; return -1; } pool = objc_msgSend(pool, sel_registerName("init")); app = objc_msgSend((id)objc_getClass("NSApplication"), sel_registerName("sharedApplication")); NSRunAlertPanel(CFSTR("Testing"), CFSTR("This is a simple test to display NSAlertPanel."), CFSTR("OK"), NULL, NULL); objc_msgSend(pool, sel_registerName("release")); return 0; } 

是的,您可以使用C ++(即将其写入* .cpp文件),甚至在* .mm文件(标准Objective-C代码存储在* .m文件中)中混合使用C ++和Objective-C。

当然,你仍然需要为你的用户界面使用Objective-C,并为你的C ++对象创buildObjective-C包装器。 另一个select是切换到支持Windows,Mac OS X和Linux的C ++框架Qt ,并将在LGPL下发布4.5版本。

是的,你可以混合他们。

您需要使用Objective-C直接操作您的GUI对象并从它们接收通知。

这些Objective-C对象可以直接调用C ++逻辑,只要将它们放在.mm文件中,而不是纯粹的Objective-C .m文件中。 请注意,您可能会看到较旧的build议,build议使用大写的.M来表示Objective-C ++,但这非常脆弱,可能会让您和编译器一样困惑。

您不需要包装每个C ++对象,但是您的Objective-C代码将需要包含指向它们的指针。

苹果有一个完整的样品与碳或CPPcocoa。 在自述文件中有更多的细节。

如果你只是想使用简单的香草C ++,这是绝对支持,真的没有任何其他平台不同。 Xcode甚至在文件>新build项目>命令行实用工具> C ++工具下有一个模板。 此外,许多stream行的开放源码库(libcurl,libxml2,sqlite等)随OS X提供,并可用于dynamic链接。 如果你不想要的话,你不必使用cocoa或苹果专用的东西。

如果你想在你的应用程序的某些部分使用Cocoa,请看一下Objective-C ++ 。 您可以在同一个文件中混合使用C ++和Objective-C扩展名.mm,或者右键单击Xco​​de中的文件并selectGet Info> General,然后将File Type更改为sourcecode.cpp.objcpp。 如果你想要在Mac特定的#ifdef中使用Objective-C的.cpp文件,第二个选项很有用。

虽然这是多年的问题…

我试图制作一些Cocoa类的C ++包装器 。

这是相当不错的经验。 C ++提供了比Objective-C更好的types安全性,并使我编写的代码更less。 但编译时间和内存安全性更差。 这是可能的,但一些基于dynamic的function并不容易处理。 我认为在C ++上处理它是没有意义的。

无论如何,由于Swift的公布,我的项目终于被抛弃了。 它首先清除了我想要使用C ++的所有原因,并提供了更多更好的内容。

如果你正在编写一个纯粹的graphics应用程序,即你正在使用代码来绘制所有的东西,那么就考虑openFrameworks 。 这是一个build立在C / C ++之上的开源graphics编程语言。 它有插件 ,允许人们扩展语言。 他们有一个iPhone的插件 。 我相信它附带的库和XCode项目将帮助您编译iPhone和iPod touch的应用程序。