为什么 Objective-C 很难

junwong 发布于 2012/03/07 11:54
阅读 166K+
收藏 73
作为一个Objective-C的coder,我总能听到一部分人在这门语言上抱怨有很多问题。他们总在想快速学习这门语言来写一个App出来,但他们也总是联想到Objective-C看上去实在太难了或者在想这些语法符号都是神马玩意?不错,他们问得非常好,所以本人也解释一下为什么很多程序员相比较学习Ruby或者Java很容易,但在决定开发iOS或者OS X应用时会那么犹豫。

语法:
首先我们谈谈神马叫做编程语言,编程语言是一种让人们能读懂并且能够展现程序的执行行为的语言,包括语法(正确的表达式以及状态机的使用规则)以及语义(如何去组织这些表达式以及状态机以一种有意义的方式去完成我们的目标)

大部分编程语言都是基于C语法风格的,也就是我们常说的点语法,依靠小数点符号来调用方法或者获取类的成员(当然了,在C语言中类被替代为结构体)。它们通常都是自己实现类的定义(注意在这里Java与C#和C++有稍微一点不一样),但无论如何这些语言的具体细节都是一样的。当我们接触一个新的编程语言时,我们当然很乐意看到新语言的语法是我们似曾相识的。毕竟大部分程序员都了解C语言的语法。

然而Objective-C压根就不是C语法风格的编程语言。它与我们熟悉的语言语法区别太大以至于大部分程序员根本看不懂这些Objective-C代码是神马东西。

甚至其他一些像Python或者Ruby这样的“奇怪”的语言都能让人看个大概出来,毕竟Python与Ruby至少还是点语法风格的,使用点语法来调用方法以及获取类的成员。相反它们缺乏分支结构并不会长时间影响程序员的理解,毕竟这两种语言也有自己的方式来完成同样的目标。

下面我们来介绍一下Objective-C语言: 这里我会拿另一个OOP语言来与它进行比较


我想这里大家肯定还不会有什么问题,来看看这个:


好了好了,我想肯定有部分人想问一大堆问题了。但这还不是最糟糕的,我们接着来看一个更强悍的:


一般到了这里,我想大家都头都大了几圈。

这到底是个神马情形?这么多分号!太恐怖了!接着会冒出一大堆问题:这到底调用的是神马方法?又是怎么调用的?是performAction吗还是别的东西?方法重载该如何做?哦,我的天!

最好先忘了我们熟悉的方法调用。实际上,当你看到performAction:withTwoParameters:时,我们其实在谈论消息而不是方法。当你能这么理解时问题就好办多了。

实际上Objective-C是很严格的C语言的超集。而与流行的编程语言风格又差距太大。作为C语言的超集,它增加了很多东西,我们将简单看看它到底增加了什么复杂的东西。

Objective-C是一个很“大”的语言,我是说它的语法很复杂而且又具备弹性。Apple公司已经尽可能减小了Objective-C语言的体积,然而,他们还是添加了一些东西来让Objecive-C表达式更加简单。
Synthesizing properties
Dot-syntax for accessing getters/setters
Garbage Collection
Blocks (closures)
Automatic Reference Counting
Weak references

所以虽然这个语言越来越大了,但是在表达同样的目的使用的代码却越来越简单。

运行时:
Objective-C的运行时是动态的,它能让你在运行时为类添加方法或者去除方法以及使用反射。
除非你用过像Ruby或者Lisp这类支持这种特性的语言,否则你会感觉很怪异。但请放心!在你尝试使用一些好的新特性时一开始都是很郁闷的。

框架:
如果离开了Cocoa/Cocoa Touch框架,那么Objective-C简直没法创建App。就如同Ruby离开了Rails就没法创建Web应用程序一样。
Cocoa既大又老。比如看看UIView的contentStretch属性,整个头文件就这么点东西:

@property(nonatomic) CGRect contentStretch __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0); // animatable. default is unit rectangle {{0,0} {1,1}}
就这么多?首先我假定它定义了一个可拉伸的内容区域,但是这是如何做到的?矩形单元又在哪里?Cocoa/Cocoa-Touch是解释这个的唯一途径,作为Objective-C的新人,你可以去咨询它。

历史:
纵向看来,Apple公司领导着Objective-C语言的发展与维护,包括Objective-C运行时,Cocoa/Cocoa-Touch框架以及Objective-C语言的编译器。看上去Objective-C就如同以下一个云状图:


当你去学习Objective-C时,它不仅仅就是一个框架,一个运行时或者一个编译器;而是它们全部。还有个很重要的部件就是 Automatic Reference Counting(使用后无法直接调用dealloc方法),这玩意会让你使用Cocoa/Cocoa-Touch编程时更加方便。


紧密耦合系统代码设计是Objective-C独有的。其他语言比如在.Net框架下运行的Iron Python。以及一大堆运行在JVM的非Java语言,比如Clojure。甚至Ruby以及Rails都是两个不同的项目。当你打算使用其他语言配合Cocoa/Cocoa-Touch以及Objective-C运行时时。你唯一的选择就是Mac Ruby。

未来 :

这4年来,我们可以看到Apple公司已经尽可能的减小了Objective-C语言的大小以及复杂度。他们也完成了手动内存自动管理以及经典C头文件的方式;而且开始慢慢对属性存取器引入点语法以及Automatic Reference Counting来方便程序员编程。但就现在看来,Objective-C还是比较难接触与学习的;之所以现在变得越来越流行唯一的原因就是它是做iOS app的唯一途径了。


原文链接OSChina.NET 原创编译

加载中
3
Injection
Injection
我觉得最难的不是object-c,而是没有苹果的机器
Alex_Lee_85
Alex_Lee_85
+1
Hyacinthus_M
Hyacinthus_M
Object-C也叫难?呵呵, Mac可以分期买。贫光一族,我买它做什么。
隋龙飞
隋龙飞
买一台Mac很难么?依照普通程序员的收入,买Mac不难吧。
Le_Guto
Le_Guto
+1
bygreencn
bygreencn
bingle!答对了,objc得在UNIX环境(不算什么类死cygwin的GNUstep),要是想搞个能上MAC,iphone,ipad的程序就得搞xcode的环境,这就只能是MAC的机器来玩了
下一页
1
libinqq
libinqq
这年头有米就是娘, 只要能给开发员带来米,就是汇编程序员也会去学的。
y
yangle
有奶就是娘。。。
yijun0514
yijun0514
非常赞同
Change_Ty
Change_Ty
太对了
1
HuiGe_sd
HuiGe_sd

引用来自“yinhao”的答案

我觉得最难的不是object-c,而是没有苹果的机器
+1
0
I
Imy
Objective-c非常容易,有C语言经验1~2天就可学会
芒鱼
芒鱼
回复 @大白良 : 你用别的API不一样要有一个熟悉的过程?
子达如何
子达如何
如果你用的是XCODE的话,语法基本没难度
最爱家乡水
最爱家乡水
我同意一楼的说法,看可以看懂,写东西是另回事了。
哈哈哈哈哈哈笑
哈哈哈哈哈哈笑
我想说看懂代码很容易,写去不知道API还是俩眼一抹黑!
0
崔钢
崔钢
不难,但苹果的机子太贵。
Ethan丶Lee
Ethan丶Lee
黑苹果是一个很好的选择。
0
开心Nemo
开心Nemo

引用来自“yinhao”的答案

我觉得最难的不是object-c,而是没有苹果的机器
对呀,贵啊
子达如何
子达如何
@Ethan.Lee oooo,,3Q~,我再研究研究,现在暂时用Acer 4750G
Ethan丶Lee
Ethan丶Lee
@啊达 那你得自己找驱动了,我是T410,驱动不一样
子达如何
子达如何
@Ethan.Lee T420的,尝试装了一下,发现安装盘启动都失败(花屏)
Ethan丶Lee
Ethan丶Lee
@啊达 你的本本是什么型号的?
子达如何
子达如何
回复 @Ethan.Lee : 请问有相关驱动的文件吗?请教啊
下一页
0
曼灵格
曼灵格
我就是做ios开发的,没感觉到啊,感觉和java是一个级别的,只有有C或java或其他语言基础,很容易上手。
0
Esnce
Esnce

引用来自“yinhao”的答案

我觉得最难的不是object-c,而是没有苹果的机器
+1
0
sam_ai
sam_ai

引用来自“yinhao”的答案

我觉得最难的不是object-c,而是没有苹果的机器
有理!同感同感
0
陈思源
陈思源
一句话:Iphone和Ipad成就了Object-C……
Mc头骨
Mc头骨
bingo
junwong
junwong
同感,,,握爪
返回顶部
顶部