第一次接触iOS会不会觉得OC的语法很奇怪,其中很重要的一个奇葩点是调用方法居然要用方括号!
为什么 Objective-C 的方法调用要用方括号[[NSString alloc]init]?
Objc的历史
1980年代初Brad Cox和Tom Love在公司Stepstone发明。1983 年,Cox 与 Love 合伙成立了 Productivity Products International(PPI)公司,将 Objective-C 及其相关库商品化贩售,并在之后将公司改名为 StepStone。
1986年,Cox 出版了一本关于 Objc 的重要著作《Object-Oriented Programming, An Evolutionary Approach》,书内详述了 Objective-C 的种种设计理念。
C++的历史
1983年,在C语言基础上贝尔实验室的Bjarne Stroustrup推出了C++
1985年公布的的C++语言1.0版的内容中又添加了一些重要特征:虚函数的概念、函数和运算符的重载、引用、常量(constant)等。
1989年推出的2.0版形成了更加完善的支持面向对象程序设计的C++语言,新增加的内容包括:类的保护成员、多重继承、对象的初始化与赋值的递归机制、抽象类、静态成员函数、const成员函数等。
最后看Objective-C的主推乔布斯的NeXTSTEP
NeXTSTEP Steve Jobs在1985年离开苹果计算机后所创立的公司。
NeXT获得了Stepstone公司的Objective-C语言授权,并扩展了著名的开源编译器GCC 使之支持 Objective-C 的编译。并基于 Objective-C 开发了 AppKit 与 Foundation Kit 等等库,作为 NeXTSTEP 的的用户接口与开发环境的基础。
第一个版本 0.8  1988年10月12日发布
Objective-C的历史远比C++久,乔布斯1985刚从苹果公司撵出去,准备卷土重来二次创业。C++ 85年才出了1.0,乔布斯建立NeXTSTEP时,估计还不知道C++是个什么玩意,而Objective-C 83年就有比较成熟的商业产品了。要你肯定也选Objective-C,不会选C++。
在设计之初,Objc和C++二者都是作为 C 语言的面向对象的接班人,希望成为事实上的标准。最后结果大家都知道了,C++ 最终胜利了,而 Objective-C 在之后的几十年中,基本上变成了苹果自己家玩的玩具。不过最终,由于 iPhone 的出现,Objective-C 迎来了第二春,在 TOBIE 语言排行榜上,从 20 名开外一路上升,排名曾经超越过 C++,达到了第三名(下图),但是随着 Swift 的出现,Objective-C 的排名则一路下滑。
Objective-C 在设计之初参考了不少 Smalltalk 的设计,而消息发送则是向 Smalltalk 学来的。Objective-C 当时采用了方括号的形式来表示发送消息,为什么没有选择用点呢?我个人觉得是,当时市面上并没有别的面向对象语言的设计参考,而 Objective-C 「发明」了方括号的形式来给对象发消息,而 C++ 则「发明」了用点的方式来 “发消息”。有人可能会争论说 C++ 的「点」并不是真正的发消息,但是其实二者都是表示「调用对象所属的成员函数」。
另外,有读者评论说使用方括号的形式是为了向下兼容 C 语言,我并不觉得中括号是唯一选择,C++ 不也兼容了 C 语言么?Swift 不也可以调用 C 函数么?
最终,其实是 C++ 的「发明」显得更舒服一些,所以后来的各种语言都借鉴了 C++ 的这种设计,也包括 Objective-C 在内。Objective-C 2.0 版本中,引入了 dot syntax,即:
a = obj.foo 等价于 a = [obj foo]
obj.foo = 1 则等价于 [obj setFoo:1]
Objective-C 其实在设计之中确实是比较特立独行的,除了方括号的函数调用方式外,还包括比较长的,可读性很强的函数命名风格。
我个人并不讨厌 Objective-C 的这种设计,但是从 Swift 语言的设计来看,苹果也开始放弃一些 Objective-C 的特点了,比如就去掉了方括号这种函数调用方式。
所以,回到我们的问题,我个人认为,答案就是:Objective-C 在 1983 年设计的时候,并没有什么有效的效仿对象,于是就发明了一种有特点的函数调用方式,现在看起来,这种方式比点操作符还是略逊一筹。
大多数语言一旦被设计好,就很难被再次修改,应该说 Objective-C 发明在 30 年前,还是非常优秀的,它的面向对象化设计得非常纯粹,比 C++ 要全面得多,也比 C++ 要简单得多。
我很高兴能够使用它来开发 iOS 程序,当然,我更期待未来 Swift 给我带来的惊喜。