使用Python而非Objective-C的缺点是什么?

13 投票
8 回答
3295 浏览
提问于 2025-04-15 18:44

我会一些Python,觉得这个语言特别好用。根据我看到的Objective-C,它看起来没那么好看,但似乎是Mac OS X开发的主要语言(这意味着它有更好的文档支持)。

我在考虑开始做Mac开发,使用PyObjC和Python会让我变得不那么重要吗?

8 个回答

3

千万不要试图逃避学习Objective-C,如果你打算为Mac写应用程序的话。PyObjC和其他语言绑定的目的是让你可以在你的应用中重用现有的库,而不是让你避开学习原生工具。

18

这段话其实说得很清楚:

作为PyObjC的维护者,我已经快15年了,我直说了。使用Objective-C吧。你要真正理解Cocoa,反正也得懂Objective-C,而PyObjC只会给你带来一些99%的Cocoa程序员都不熟悉的bug和问题。

这是对这个问题的回答中的一条评论。这个问题也很有意思。

37

是的。

首先,正如你所提到的,所有的文档都是用Objective-C写的,而这是一种非常不同的语言。

其中一个区别是方法名称。在Objective-C中,当你给一个对象发送消息(在Python中可以理解为“调用一个方法”)时,方法名称(选择器)和参数是混合在一起的:

NSURL *URL = /*…*/;
NSError *error = nil;

QTMovie *movie = [QTMovie movieWithURL:URL
    error:&error];

在Python中这是不可能的。Python的关键字参数并不算作方法名称的一部分,所以如果你这样做:

movie = QTMovie.movieWithURL(URL, error = ???)

你会遇到异常,因为QTMovie类没有名为movieWithURL的方法;而Objective-C示例中的消息使用的是选择器movieWithURL:error:movieWithURL:movieWithURL会是另外两个选择器。

这点是无法改变的,因为Python的关键字参数没有顺序。假设你有一个假设的三参数方法:

foo = Foo.foo(fred, bar=bar, baz=baz)

现在,这个调用的是foo:bar:baz:,对吧?

可别急。Foo也可能有一个名为foo:baz:bar:的方法。因为Python的关键字参数没有顺序,你实际上可能在调用那个方法。同样,如果你试图调用foo:baz:bar:,你可能最终会调用foo:bar:baz:。虽然这种情况不太可能发生,但如果真的发生了,你将无法可靠地调用任何一个方法。

所以,在PyObjC中,你需要这样调用方法:

movie = QTMovie.movieWithURL_error_(URL, ???)

你可能会对???感到好奇。C不允许多个返回值,因此在Objective-C中,error:参数接受一个指向指针变量的指针,而这个方法会把一个对象存储在那个变量中(这叫做通过引用返回)。Python没有指针,所以桥接处理这类参数的方式是你传递None,然后方法会(看起来)返回一个元组。所以正确的例子是:

movie, error = QTMovie.movieWithURL_error_(URL, None)

你可以看到,即使是一个简单的例子,也与文档中展示的Objective-C有所不同。

还有其他问题,比如GIL。Cocoa应用程序只会变得越来越并发,而你会想参与其中,尤其是像NSOperation这样的诱人类。并且GIL在多核机器上是一个严重的负担。我作为一个Python开发者(不写Cocoa的时候)这样说。正如David Beazley在那个视频中演示的那样,这是一个冷酷的事实;无法否认。

所以,如果我要从Objective-C转向其他语言开发我的应用,我会选择MacRuby。与PyObjC和RubyCocoa不同,向Cocoa对象发送消息不需要跨语言桥接;这是一个从头开始的Ruby实现,专门为Cocoa设计,支持用Ruby编写Cocoa代码。

但这对你来说有点超前。你刚刚开始。先从Objective-C入手。保持使用同一种语言,这样可以避免与文档所用语言之间的所有不匹配。

此外,你会发现一些错误(比如发送消息给已经不存在的对象)在没有了解Objective-C工作原理的情况下更难诊断。作为一个新的Cocoa程序员,你肯定会写出这些错误,无论你用什么语言编写代码。

所以,先学C,然后学Objective-C。掌握这两者应该不会超过几周的时间,最后你会为接下来的学习做好更好的准备。

我不会详细讲我学习C的过程;只说我不推荐我当时的学习方式。我听说这本书不错,但我从来没有拥有过或阅读过。我有这本书,可以确认它很好,但它也不是专门针对Mac的;跳过关于如何编译代码的章节,直接使用Xcode。

至于Objective-C:Hillegass的书是最受欢迎的,但我没有用过。(我翻阅过,看起来不错。)我阅读了苹果的语言文档,然后直接开始写小的Cocoa应用。我也读了一些指南,效果参差不齐。有一个货币转换器教程,但对我没有任何帮助,而且并不完全反映现代Cocoa应用。(现代应用仍然使用outlets和actions,但也使用Bindings,一个现实的货币转换器几乎完全是几个Bindings的结合。)

撰写回答