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

Wan*_*uta 13 python macos cocoa pyobjc

我知道一些Python,我对这种语言的易用性印象深刻.从我所看到的Objective-C来看,它看起来不那么漂亮,但它似乎是Mac OS X开发的通用语言(这意味着它有更好的文档).

我正在考虑启动Mac开发 - 使用PyObjC + Python会让我成为二等公民吗?

Pet*_*sey 36

是.

首先,正如您所注意到的,所有文档都是针对Objective-C编写的,这是一种非常不同的语言.

一个区别是方法名称.在Objective-C中,当您向(Python称"调用方法")对象发送消息时,方法名称(选择器)和参数是混合的:

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

QTMovie *movie = [QTMovie movieWithURL:URL
    error:&error];
Run Code Online (Sandbox Code Playgroud)

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

movie = QTMovie.movieWithURL(URL, error = ???)
Run Code Online (Sandbox Code Playgroud)

你会得到一个例外,因为QTMovie类没有命名的方法movieWithURL; Objective-C示例中的消息使用选择器movieWithURL:error:.movieWithURL:movieWithURL将其他两个选择.

他们无法改变这种情况,因为Python的关键字参数不是有序的.假设您有一个假设的三参数方法:

foo = Foo.foo(fred, bar=bar, baz=baz)
Run Code Online (Sandbox Code Playgroud)

现在,这个电话foo:bar:baz:,对吗?

没那么快.Foo也可能有一个名为的方法foo:baz:bar:.因为Python的关键字参数没有排序,所以您实际上可能正在调用该方法.同样,如果你试图打电话foo:baz:bar:,你实际上最终可能会打电话foo:bar:baz:.实际上,这种情况不太可能,但如果它发生了,你将无法可靠地调用这两种方法.

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

movie = QTMovie.movieWithURL_error_(URL, ???)
Run Code Online (Sandbox Code Playgroud)

你可能想知道???.C不允许多个返回值,因此,在Objective-C中,error:参数获取指向指针变量的指针,该方法将在该变量中存储一个对象(这称为返回引用).Python没有指针,因此桥接器处理这样的参数的方式是你传递None,并且该方法将(看起来)返回一个元组.所以正确的例子是:

movie, error = QTMovie.movieWithURL_error_(URL, None)
Run Code Online (Sandbox Code Playgroud)

您可以看到一个简单的示例如何与Objective-C中的文档可能显示的内容不同.

还有其他问题,例如GIL.Cocoa应用程序只会获得更多的并发性,并且你会想要这个,尤其是像NSOperation这样的诱人课程.而在GIL是一个严肃的责任,尤其是在多核机器.我自己说这是一个Python人(当不写Cocoa时).正如David Beazley在那段视频中所展示的那样,这是一个冷酷而艰难的事实; 无可否认.

所以,如果我要为我的应用程序切换远离Objective-C,我会接受MacRuby.与PyObjC和RubyCocoa不同,到Cocoa对象的消息不会跨越语言桥; 它是Cocoa中一个从头开始的Ruby实现,具有语言扩展,可以更好地支持在其中编写Cocoa代码.

但这远远超过你.你刚刚开始.从Objective-C开始.最好避免使用的语言与编写文档的语言之间的所有阻抗不匹配,使它们保持相同的语言.

另外,如果不了解Objective-C的工作原理,您会发现一些错误(例如对已故对象的消息)更难诊断.您将把这些错误编写为新的Cocoa程序员,无论您编写代码的语言是什么.

所以,学习C,然后学习Objective-C.两者的工作知识不应该花费超过几个星期,并且最后,你将为其他一切做好准备.

我不会讲述我是如何学习C的; 足以说我不推荐我这样做的方式.我听说这本书很好,但我从未拥有或阅读过.我确实有这本书,可以证实它很好,但它也不是特定于Mac的; 跳过有关如何编译代码的章节,并使用Xcode代替.

至于Objective-C:Hillegass书是最受欢迎的,但我没有使用它.(我已经浏览了它,它看起来不错.)我阅读了Apple关于该语言的文档,然后直接编写了小型Cocoa应用程序.我阅读了一些指南,结果好坏参半.有一个货币转换器教程,但它根本没有帮助我,并没有完全反映现代Cocoa应用程序.(现代应用程序仍然使用出口和操作,但Bindings和现实的货币转换器几乎完全是几个Bindings.)

  • MacRuby显然是桥接语言中"最原生的",但它仍然不是远程原生的.Xcode不支持它,如果没有转换到Objective-C,您将无法查找文档,并且基于MacRuby的Cocoa问题将极大地减少可能能够回答的人数.考虑到你需要学习Objective-C来使用Cocoa API,这是更不必要的移动部件. (6认同)

Ram*_*nka 18

这真的说明了一切:

作为PyObjC的维护者近15年,我会直言不讳地说.使用Objective-C.你需要知道Objective-C才能真正理解Cocoa,而PyObjC只会添加一层与99%的Cocoa程序员不同的错误和问题.

回答这个问题的评论.这个问题也很有趣.