我最近购买了一台Mac,主要用于VMWare Fusion下的C#开发.随着所有不错的Mac应用程序的出现,我开始考虑Xcode潜伏,只需点击一下即可安装,并学习Objective-C.
两种语言之间的语法看起来非常不同,可能是因为Objective-C起源于C,而C#起源于Java/C++.但是可以学习不同的语法,所以应该没问题.
我主要担心的是使用该语言,是否有助于生成结构良好,可读且优雅的代码.我非常喜欢LINQ和C#中的var等功能,并想知道Objective-C中是否有等价物或更好/不同的功能.
我会错过使用Objective-C开发哪些语言功能?我会获得什么功能?
编辑:框架比较是有用和有趣的,但语言比较是这个问题的真正要求(部分是我最初标记的错误.net
).据推测,Cocoa和.NET本身都是非常丰富的框架,两者都有其目的,一个针对Mac OS X和另一个Windows.
感谢您到目前为止经过深思熟虑和合理平衡的观点!
没有语言适合所有任务,Objective-C也不例外,但有一些非常具体的细节.就像使用LINQ
和var
(我不知道直接替换)一样,其中一些严格与语言相关,而另一些则与框架相关.
(注意:就像C#与.NET紧密结合一样,Objective-C与Cocoa紧密结合.因此,我的一些观点似乎与Objective-C无关,但没有Cocoa的Objective-C类似于C#而没有.NET/WPF/LINQ,在Mono下运行,等等.这不是通常的事情.)
我不会假装完全阐述差异,优点和缺点,但这里有一些想到的东西.
Objective-C最好的部分之一是动态性质 - 而不是调用方法,您发送消息,运行时动态路由.结合(明智地)动态类型,这可以使许多强大的模式更简单甚至无法实现.
作为C的严格超集,Objective-C相信您知道自己在做什么.与C#和Java等语言的托管和/或类型安全方法不同,Objective-C可以让您按照自己的意愿行事并体验后果.显然这有时会很危险,但是语言并没有主动阻止你做大多数事情这一事实非常强大.(编辑:我应该澄清C#也有"不安全"的特性和功能,但它们的默认行为是托管代码,你必须明确选择退出.相比之下,Java 只允许类型安全代码,并且永远不会暴露原始指针C和其他人的方式.)
类别(在没有子类或访问源的类上添加/修改方法)是一把令人敬畏的双刃剑.它可以极大地简化继承层次结构并消除代码,但如果你做了一些奇怪的事情,结果有时会令人费解.
Cocoa在许多方面使创建GUI应用程序变得更加简单,但你必须围绕这个范例.MVC设计在Cocoa中很普遍,代理,通知和多线程GUI应用程序等模式非常适合Objective-C.
Cocoa绑定和键值观察可以消除大量的胶水代码,Cocoa框架可以广泛利用这一点.Objective-C的动态调度与此相辅相成,因此只要符合键值,对象的类型就无关紧要.
您可能会错过泛型和命名空间,并且它们有其优点,但在Objective-C思维模式和范例中,它们将是细节而非必需品.(泛型都是关于类型安全和避免转换,但是Objective-C中的动态类型使得这基本上不是问题.如果做得好,命名空间会很好,但它足够简单以避免冲突,成本可能超过收益,特别是对于遗留代码.)
对于并发性,Blocks(Snow Leopard中的一种新语言功能,并在许多Cocoa API中实现)非常有用.几行(通常与Grand Central Dispatch相结合,它是10.6上的libsystem的一部分)可以消除回调函数,上下文等的重要模板.(块也可以在C和C++中使用,并且当然可以添加到C#中,通过调度自定义NSOperation子类或GCD在一个或多个不同线程上自动执行的匿名块,NSOperationQueue也是一种非常方便的方法,可以为您自己的代码添加并发性.
我已经用C,C++和C#编程了20多年,最初是在1990年开始的.我刚刚决定看一下iPhone开发和Xcode以及Objective-C.哦,我的天啊......关于微软的所有抱怨我收回了,我现在意识到代码有多么糟糕.与C#相比,Objective-C过于复杂.我已经被C#宠坏了,现在我感谢微软付出的所有努力.只是阅读使用方法调用的Objective-C很难阅读.C#很优雅.这只是我的观点,我希望苹果的开发语言能像苹果产品一样好,但亲爱的我,他们有很多需要向微软学习的东西.毫无疑问,C#.NET应用程序我可以比XCode Objective-C更快地启动和运行应用程序.苹果当然应该从微软的书中脱颖而出,然后我们就拥有了完美的环境.:-)
这里没有技术评论,但我发现Objective-C的可读性差得多.鉴于Cinder6给你的例子:
C#
Liststrings = new List (); strings.Add("xyzzy"); // takes only strings strings.Add(15); // compiler error string x = strings[0]; // guaranteed to be a string strings.RemoveAt(0); // or non-existant (yielding an exception)
Objective-C的
NSMutableArray *strings = [NSMutableArray array]; [strings addObject:@"xyzzy"]; [strings addObject:@15]; NSString *x = strings[0]; [strings removeObjectAtIndex:0];
看起来很糟糕.我甚至尝试过阅读2本书,他们很早就把我弄丢了,通常情况下我不会用编程书籍/语言.
我很高兴我们有Mono for Mac OS,因为如果我不得不依靠Apple给我一个良好的开发环境......
手动内存管理是Objective-C的初学者似乎最常遇到的问题,主要是因为他们认为它比它更复杂.
Objective-C和Cocoa的扩展依赖于执行方面的约定; 知道并遵循一小部分规则,您可以通过动态运行时获得大量免费回报.
不是100%真实的规则,但每天足够好是:
每次调用alloc
都应与release
当前范围的末尾匹配.
如果已经获得了方法的返回值,alloc
那么它应该返回return [value autorelease];
而不是由a匹配release
.
使用属性,没有规则三.
更长的解释如下.
内存管理基于所有权; 只有一个对象实例的所有者应该永远释放对象,大家还应该总是什么都不做.这意味着在95%的代码中,您将Objective-C视为垃圾收集.
那么其他5%呢?您需要注意三种方法,从这些方法接收的任何对象实例都归当前方法范围所有:
alloc
任何以单词new开头的方法,例如new
或newService
.
包含单词copy的任何方法,例如copy
和mutableCopy
.
该方法有三个可能的选项,如何在退出之前如何处理它拥有的对象实例:
release
如果不再需要,请将其释放.
通过简单地分配它来为a字段(实例变量)或全局变量赋予所有权.
放弃所有权,但在实例离开之前通过呼叫让其他人有机会取得所有权autorelease
.
那么你什么时候应该主动通过电话取得所有权retain
?两种情况:
在初始化程序中分配字段时.
手动实现setter方法时.
当然,如果你在生活中看到的一切都是目标C,那么它的语法看起来是唯一可能的.我们可以称你为"编程处女".
但是由于许多代码都是用C,C++,Java,JavaScript,Pascal和其他语言编写的,所以你会发现ObjectiveC与所有代码都不同,但并不是很好.他们有理由这样做吗?让我们看看其他流行语言:
C++为C添加了很多额外内容,但它只根据需要改变了原始语法.
与C++相比,C#增加了很多额外功能,但它只改变了C++中的丑陋(比如从界面中删除"::").
Java改变了很多东西,但它保留了熟悉的语法,除了需要更改的部分.
JavaScript是一种完全动态的语言,可以做很多ObjectiveC不能做的事情.尽管如此,它的创造者并没有发明一种新方法来调用方法和传递参数只是为了与世界其他地方不同.
Visual Basic可以不按顺序传递参数,就像ObjectiveC一样.您可以为参数命名,但也可以按常规方式传递它们.无论你使用什么,它都是以每个人都能理解的正常逗号分隔方式.逗号是通常的分隔符,不仅在编程语言中,而且在书籍,报纸和书面语言中.
Object Pascal具有与C不同的语法,但其语法实际上更容易为程序员阅读(可能不是计算机,但是谁关心计算机的想法).也许他们离题了,但至少他们的结果更好.
Python有不同的语法,比Pascal更容易阅读(对于人类而言).因此,当他们改变它,使它变得不同时,至少它们使我们的程序员更好.
然后我们有ObjectiveC.添加一些改进C,但发明自己的接口语法,方法调用,参数传递和什么不.我想知道他们为什么不交换+和 - 所以加上减去两个数字.它会更酷.
史蒂夫乔布斯通过支持ObjectiveC搞砸了.当然他不能支持C#,这是更好的,但属于他最糟糕的竞争对手.所以这是一个政治决定,而不是一个实际的决定.当出于政治原因做出技术决策时,技术总会受到影响.他应该领导他做得好的公司,并将编程问题留给真正的专家.
如果他决定用除ObjectiveC以外的任何其他语言编写iOS和支持库,我相信会有更多的iPhone应用程序.对于除了铁杆粉丝,处女程序员和史蒂夫乔布斯之外的所有人,ObjectiveC看起来都是荒谬,丑陋和令人厌恶的.
我喜欢objective-c的一件事是对象系统基于消息,它可以让你做很多在C#中无法做到的好事(至少在他们支持动态关键字之前!).
编写可可应用程序的另一个好处是Interface Builder,它比Visual Studio中的表单设计器好很多.
关于obj-c的事情让我烦恼(作为C#开发人员)是你必须管理自己的内存(有垃圾收集,但这在iPhone上不起作用)的事实,并且它可能非常冗长,因为选择器语法和所有[].