1、了解Objective-C语言的起源
Objective- C与C++、Java等面向对象语言类似,不过很多方面有所差别。语法上该语言使用“消息结构”而非“函数调用”。Objective-C语言由Smalltalk演化而来,后者是消息型语言鼻祖。
消息与函数调用之间的区别:
关键区别:
使用消息结构的语言,其运行所应执行的代码由运行环境来决定;而使用函数调用的语言,则由编译器决定。对于函数结构,如果范例代码的调用函数是多态的,那么就在运行时按照虚方法表来查出来到底执行哪个函数,而采用消息结构的语言,不管是否为多态总是在运行时才会去查找所要执行的方法。实际上,编译器甚至不关心接收的对象是何种类型。接受消息的对象问题也要在运行时处理,其过程叫做“动态绑定”。
运行期组件
Objective-C的重要工作都由“运行期组件”(runtime component)而非编译器来完成。使用Objective-C的面向对象特性所需的全部数据结构及函数都在运行期组件里面。举例来说,运行期组件中含有全部内存管理方法。运行期组件本质上就是一种与开发者所编代码相链接的“动态库”(dynamic library),其代码能把开发者编写的所有程序粘合起来。这样的话,只需更新运行期组件,即可提升应用程序性能。而那种许多工作都在“编译期”(compile time)完成的语言,若想获得类似的性能提升,则要重新编译应用程序代码。
内存模型
理解C语言的内存模型(memory model),这有助于理解Objective-C的内存模型及其“引用计数”(reference counting)机制的工作原理。若要理解内存模型,则需明白:Objective-C语言中的指针是用来指示对象的。想要声明一个变量,令其指代某个对象,可用如下语法:
例如上述代码,声明了一个someString 的变量,此变量为指向NSString的指针。所有OC语言的对象都必须这样声明,因为对象所占内存总是分配在“堆空间”中,而绝不会分配在“栈”上。不能在栈中分配内存对象。