Objective-C与C++,java等面向对象的语言类似,但是在使用Objective-C的类创建对象,并且这个对象“调用自身类的方法的时候”,我们叫做给对象发送一个消息,而不是调用方法,这就是Objective-C和C++不同的关键所在,因为该语言使用“消息结构”(message structure)而非“函数调用”(function calling)。消息和函数的区别,像下面一样。
Messaging (Objective-C)
<span style="font-size:18px;background-color: rgb(255, 255, 255);"> <span style="color:#ff6666;">Object *obj=[[Object alloc] init];
[obj performWith:parameter1 and:parameter2]d;</span></span>
Function calling (C++)
</pre><pre name="code" class="cpp"><span style="font-size:18px;color:#ff6666;"> Object *obj=new Object;
obj->perform(parameter1,parameter2);</span>
关键在于:使用消息结构的语言,其运行时所执行的代码由运行环境决定;而使用函数调用的语言由编译器决定,如果范例代码中调用的函数是多态的,那么运行时就要按照编译器生成的“虚函数表”(virtual table)进行查询到底该执行哪个函数的实现,而采用消息结构的语言,不论是否多态,总是在运行时才去查找所要执行的方法。实际上编译器甚至不关心接收消息的对象时何种类型。
我们先看Objective-C类的定义(这个类的定义,在运行时库里,运行库的代码苹果已经开源)
</pre><pre name="code" class="objc"><span style="font-size:18px;color:#ff6666;">typedef struct objc_class *Class //Class就是指向类结构体的指针</span></span>
<span style=&#