Objective-C runtime(一) 消息传递机制

对Objective-C 等面向对象语言来说,『对象』(object)就是『基本构造单元』,开发者可以通过对象来存储并传递数据。在对象之间传递数据并执行任务的过程就叫做『消息传递』。

Objective-C 是C 的超集,我们先来理解C语言的函数调用方式。
C语言使用『静态绑定』(static binding)。编译器在编译代码的时候就已经知道程序中的函数,会直接生成调用相关函数的指令。
不同于C,在Objective-C中,如果向某对象传递消息,会使用『动态绑定』(dynamic binding)机制来决定需要调用的方法。在底层,所有方法都是普通的C语言函数,然而对象收到消息之后,究竟该调用哪个方法则完全取决于运行期决定,甚至可以在程序运行时改变

给对象发送一条消息

id returenValue = [someObject messageName:parameter];

在本例中,someObject是消息的『接收者』(receiver),messageName是『选择器』(selector)即方法名。
编译器看到这条消息后,将其转换为一条标准的C语言函数使用,所调用的函数是消息传递机制中的核心函数,叫做objc_msgSend,原形如下:

void objc_msgSend(id self, SEL cmd, ...);

这个是『参数个数可变的函数』,能接受两个或者两个以上的参数。第一个参数代表接收者,第二个参数代表选择器,后续参数是消息中的那些参数,其顺序不变。

id returnValue = objc_msgSend(someObject , @selector(message:) , parameter);

objc_msgSend函数会依据接收者与选择器的类型来调用适当的方法。该方法需要在接收者所属的类中搜寻其『方法列表』,如果能找到与选择器名称相符的方法,就跳至其实现代码。若是找不到,那就沿着继承体系继续向上查找,等找到合适的方法之后再跳转。如果最终还是找不到相符的方法,就执行『消息转发』(message forwarding)。(后续介绍)
这一套就是『动态消息派发系统』(dynamic message dispatch system)。发送给对象的全部消息都由其处理,该系统会查出对应的方法,并执行其代码。

你可能感兴趣的:(Objective-C runtime(一) 消息传递机制)