什么是Objective-C for Mac编程的替代品?

时间:2008-11-06 11:04:04

标签: objective-c cocoa macos

我在无指针,垃圾收集编程语言的世界中变得非常舒服。现在我必须编写一个小型Mac组件。我一直在学习Objective-C,但是当我面对悬挂指针的可能性以及管理保留计数的必要性时,我感到沮丧。

我知道Objective-C现在有垃圾收集,但这只适用于Leopard。我的组件也必须与Tiger合作。

我需要访问一些Java不可用的Cocoa库,因此排除了我常用的武器选择。

我有什么选择?特别是没有显式指针和自动垃圾收集。

13 个答案:

答案 0 :(得分:19)

“组件”是什么意思?您是指要将其他人链接到他们的应用程序中的大量代码或库吗?如果是这样的话,那么现在使用任何桥接语言是不现实的。虽然许多桥梁非常好,但它们几乎总是存在复杂性和问题,大多数应用程序开发人员都不愿意使用单个组件,特别是如果涉及引入大量运行时。

桥接对于将其他语言库桥接到Objective C应用程序最有价值。虽然您可以使用它们编写相当完整的应用程序,但这样做通常需要更好地理解Objective C,而不仅仅是编写Objective C应用程序,因为您需要了解并处理语言,对象模型,线程和内存分配阻抗不匹配,发生。

这也是为什么许多人认为即使你对一种语言非常熟悉,尝试通过桥梁学习使用该语言的Cocoa通常更难以使用Objective C进行学习。

最后,最近对桥接语言的大部分支持归功于“BridgeSupport”,Leopard中添加了一项功能。即使是那些早于过去的桥梁也在向着这种方向迁移,有时候使用Tiger和Leopard上的桥接语言会产生很大的差异。此外,目前还没有iPhone的桥接支持,如果这是一个问题,大多数桥接语言都无法使用它。

最终,如果您正在编写一个将链接到其他应用程序的库,您需要在Tiger和Leopard上运行,并且您需要访问仅使用Cocoa的API,我认为您将使用任何非Objective C解决方案很难。

答案 1 :(得分:11)

您可以尝试PyObjC在python中编写Cocoa应用程序,如果您对Ruby感兴趣,可以尝试MacRuby

答案 2 :(得分:9)

你不应该被Cocoa的保留/释放引用计数吓倒。实践中,这比GC粉丝相信要容易得多。 Cocoa memory management rules很简单,它们只会影响很少量的代码,甚至 代码也可以自动生成。

这就是诀窍。您将MM代码封装在访问器方法中,始终使用访问器。 Xcode具有内置脚本来生成适当的访问者,或者如果您需要更多灵活性,则会有第三部分应用程序,如Accessorizer

这不是一种侵入式方法 - 如果你需要保留一个对象以供以后使用,你只需要担心保留一个对象,如果你要这样做,你需要一个实例变量无论如何要保持它。而且,如果您正在使用KVO和绑定,则需要使用访问器以确保触发相应的观察者通知。基本上,如果您正在使用良好的OOP和Cocoa实践,那么内存管理几乎不需要额外的思考或努力。

对于Cocoa的“手动”内存管理有困难的大多数人都是因为误用它而这样做的。最常见的错误是将相关代码分散到各处。这意味着很难找到遗失,额外释放等。

答案 3 :(得分:3)

尝试此处http://www.cocoadev.com/index.pl?CocoaBridges

中列出的任何Cocoa网桥

你也可以尝试F-Script - 一种专为MacOSX / Cocoa编写的小方言。

答案 4 :(得分:2)

RubyCocoa越来越令人印象深刻,我已经看到很多使用它的成功实现。那当然,如果Ruby是你的一杯茶......

答案 5 :(得分:1)

您可以随时使用REALbasic(www.realsoftware.com)。真正轻松有趣,但不是免费的。你不能使用dylibs(或dll),但你可以在你的代码中使用dylibs和dll。你也可以使用可可库

答案 6 :(得分:1)

不要忘记你也可以使用java,我不是指java-cocoa桥,我的意思是实际的java。

苹果还提供了一个包,可以访问几个osx功能。

同样评论Shem的观点,如果你的目标是osx 10.5及以上,你可以利用垃圾收集。

答案 7 :(得分:1)

如果你想要lisp语法,那么Nu就是在Objective-C http://www.programming.nu/

之上实现的lisp

答案 8 :(得分:1)

此外,FreePascal可以生成原生碳应用程序(正在为Coccoa工作)

答案 9 :(得分:0)

查看PythonwxPython(Python中的wxWidgets)。

wxWidgets具有非常优雅的App-Doc-View应用程序设计模式,非常非常好。它没有用得足够,IMO。我没有找到这个App-Doc-View示例的任何wxPython示例,因此您必须使用C示例来推断它在Python中的工作方式。

我会发布一些例子,但我还没有完成所有工作。

答案 10 :(得分:0)

.NET via Mono mono-project.com

答案 11 :(得分:0)

参见NObjective(http://code.google.com/p/objcmapper/)与Cocoa的桥梁。它提供的功能比其他功能更少,而且开销更少。

答案 12 :(得分:0)

我也在研究Mono。在这一点上,Objective-C对我来说有点太奇怪了。做C / C ++,Java,C#,Perl等太多年了。我想。所有这些看起来都很容易漂浮。 Objective-C不是这样。爱我的Mac,但担心掌握这门语言需要花费太多宝贵的时间。