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.)