【问题标题】:What are alternatives to Objective-C for Mac programming?用于 Mac 编程的 Objective-C 的替代品有哪些?
【发布时间】:2010-09-21 01:32:23
【问题描述】:

我已经在无指针、垃圾收集的编程语言的世界中变得非常自在。现在我必须编写一个小的 Mac 组件。我一直在学习 Objective-C,但是当我面临悬空指针的可能性和管理保留计数的需要时,我感到很沮丧。

我知道 Objective-C 现在有垃圾回收功能,但这只适用于 Leopard。我的组件也必须与 Tiger 一起使用。

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

我有哪些选择?尤其是没有显式指针和自动垃圾回收。

【问题讨论】:

  • Objective-C 2.0 确实有垃圾回收功能。
  • 他说这也得和老虎一起工作。这排除了垃圾收集器。
  • Obj-C 没有垃圾收集实际上并不重要(总是)。它使用带有自动释放池的引用计数系统。正确标记 OBj-C 类变量意味着将添加必要的代码来管理引用计数 - 您不需要使用 AppKit 在 Objective-C 中显式管理引用计数。
  • @Chris,这仅在 Objective-C 2.0 中是正确的,它仅是 Leopard 及更高版本。在 Objective-C 1.0 中,您必须创建自己的访问器方法,包括在 -dealloc 中管理保留/复制/分配和释放。这并不意味着它实际上要困难得多,但您必须做的不仅仅是“正确标记类变量”。

标签: objective-c cocoa macos


【解决方案1】:

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

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

这也是为什么很多人争辩说,即使你非常熟悉一门语言,尝试通过桥梁使用该语言学习 Cocoa 通常比使用 Objective C 学习它更困难。

最后,最近对桥接语言的支持大部分归功于 Leopard 中添加的“BridgeSupport”功能。即使是早于已经迁移的桥,有时在 Tiger 和 Leopard 上使用桥接语言也会有很大的不同。此外,目前还没有对 iPhone 的桥接支持,如果这是一个问题,大多数桥接语言将无法在其上运行。

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

【讨论】:

  • 不是我想听到的,但有时就是这样。不过我可能会看看 Python,看看我能做什么。
【解决方案2】:

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

【讨论】:

  • 但是您几乎肯定会希望使用 Leo/Xcode 3+ 来执行 PyObjC,并且我想检查您创建的代码在 Leopard 之前是否有效。
【解决方案3】:

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

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

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

大多数对 Cocoa 的“手动”内存管理有困难的人都是因为误用了它。最常见的错误是将相关代码分散在各处。这意味着很难找到缺少的保留、额外的释放等。

【讨论】:

    【解决方案4】:

    尝试http://www.cocoadev.com/index.pl?CocoaBridges 中列出的任何 Cocoa 桥接器

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        您始终可以使用 REALbasic (www.realsoftware.com)。真正简单有趣的使用,虽然不是免费的。您不能使用它制作 dylib(或 dll),但您可以在代码中使用 dylib 和 dll。你也可以使用可可库

        【讨论】:

          【解决方案7】:

          别忘了你也可以使用java,我不是说java-cocoa桥,我是说真正的java。

          还有一个来自 Apple 的软件包,它还可以让您访问一些 osx 功能。

          还要评论一下 Shem 的观点,如果您的目标是 osx 10.5 及更高版本,您可以利用垃圾回收。

          【讨论】:

            【解决方案8】:

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

            【讨论】:

              【解决方案9】:

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

              【讨论】:

                【解决方案10】:

                查看PythonwxPython(Python 中的 wxWidgets)。

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

                我会发布示例,但我也还没有完成所有工作。

                【讨论】:

                • 没有什么比能够使用 Interface Builder 开发 UI 更好的了。您将不得不更加努力地使用任何其他 API 获得“类似 Mac”的 UI。
                • 加倍努力——是的。不是“堆”,但肯定是相当多的工作。
                • 我很想在 OSX 上看到一个 wxWidgets 应用程序的好例子……它们看起来都像废话。
                • @schwa:“看起来像垃圾”?实现应用程序的小部件或代码?
                • @S.Lott - 两者都不是。非原生应用的问题更多在于“感觉”而不是“外观”。错误位置的按钮、非标准键盘快捷键等。制作原生 Mac 应用程序远不止使用原生(或具有原生外观的)小部件。
                【解决方案11】:

                .NET 通过 Mono mono-project.com

                【讨论】:

                  【解决方案12】:

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

                  【讨论】:

                    【解决方案13】:

                    我也在研究 Mono。在这一点上,Objective-C 对我来说有点太奇怪了。做 C/C++、Java、C#、Perl 等太多年了。我想。所有这些似乎都很容易在两者之间浮动。对于 Objective-C 来说并非如此。喜欢我的 Mac,但担心掌握这门语言会花费太多宝贵的时间。

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 2014-09-30
                      • 2010-09-25
                      • 1970-01-01
                      • 2012-12-18
                      • 2010-11-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多