RuntimeObjective-C是动态运行的,可能单单从其与C的渊源这个角度来看这个特性并不那么直观。由于不需要直接编写汇编码,C语言自身是一门变化较低的语言,鉴于Objective-C是C的超集,我们很容易将Objective-C的稳定性趋向于C,但现实际上,Objective-C是动态运行的且灵活性相当高的语言。Objective-C支持函数柯里化(function currying),支持反射机制,可以在运行时动态地为类添加或移除方法。 除非你之前有接触过类似Objectivec-C这些特性的编程语言,比如说Ruby或Lisp,否则一时间很难适应Objective-C。但是无需担忧!有些东西,外表看起来神秘可怕其实本质没那么复杂。 Framework使用Objective-C构建apps完全离不开Cocoa/Cocoa Touch框架。就好像用Ruby开发web应用离不开Rails一样。 经过经年累月的发展,Cocoa已经变得非常的厚重。不过如前文所说,苹果最近正在逐渐的为常规iOS开发所依赖的Cocoa Touch框架进行减肥,以降低它的复杂度。即便如此,哪怕要开发的app极其简单,也还是有许多东西要学,像苹果的官方文档还有已暴露的各种头文件都是很好的学习资源。就拿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是庞大的框架。要真正的驾驭它就只能靠熟能生巧了。但这个熟悉它的过程常常使很多新的学习者退缩。 History一直以来,苹果都在不停的推动着围绕Objective-C语言开发体系的进步,像Objective-C runtime,Cocoa/Cocoa Touch框架以及针对Objective-C的编译器等一系列更高层面设计的交叉重叠使得Objective-C不仅仅是一个语言这么简单。 所以当学习Objective-C的时候,不能孤立的去学习这门语言、某些框架、它的运行机制或编译器,而是要把他们融会贯通。比如说现在Objective-C集成的ARC(Automatic Reference Counting)机制就涉及到了语义(不需要显示调用dealloc了)层面、编译器层面(显而易见)、以及对Cocoa/Cocoa Touch框架的命名约定等内容。 上文所提到的围绕Objective-C的一些列紧密关联的设计算是其独有的特点。其他的语言或多或少都会依赖于别的的语言或平台来运行,比如基于.net运行的Iron Python,不是Java但是却依赖JVM的Clojure,甚至Ruby和Rails其实都有各自相对独立的实体和工程。唯一一个比较知名的受Cocoa/Cocoa Touch和Objective-C runtime支撑运行的Mac Ruby,后来也被苹果停掉后了后续支持。 Objective-C和相关的框架、runtime以及编译器等等这个体系对其他开发者社区而言是又几乎是封闭的。 未来从目前掌握的信息来看,过去的四年来苹果一直在尝试降低Objective-C语言的复杂度。淘汰手动内存管理以及C标准头文件,引入更符合当下编程语言潮流的ARC机制,还有通过.语法来访问属性的getter/setter方法等等都是为了降低Objective-C的学习成本。但是即便如此,Objective-C仍然是具备一定学习门槛的开发语言,它的热度完全那些基于Objective-C编写的热门iOS应用带起来的。 原文链接: ashfurrow 翻译: 伯乐在线 - sunset |