首页 > 代码库 > 第11条:理解objc_msgSend的作用

第11条:理解objc_msgSend的作用

C语言使用“静态绑定”,也就是说,在编译期就能决定运行时所应调用的函数(也就是说函数地址硬编码在指令之中)。

 

如果是内联函数,就无法硬编码在指令之中,而是要在运行期读取出来(也就是动态绑定)。

 

在底层,所有方法都是普通的C函数。

 

OC对象的每个方法都可以视为简单的C函数。

<return_type> Class_selector(id self, SEL _cmd, .....);

 

动态绑定由编译器转换成一条C语言函数,所调用的函数乃是消息传递机制中的核心函数,叫做objc_msgSend

 

void objc_msgSend(id self, SEL cmd, .....) 该方法在接收者所属类中搜寻“方法列表”,找到则跳至实现代码,找不到延继承体系继续向上查找,最终如果还是找不到,就执行“消息转发”操作。

 

略,,,,,,,,,,,,

 

第12条:理解消息转发机制

在编译期向类发送了其无法解读的消息并不会报错,因为在运行期可以继续向类中添加方法。

当对象接收到无法解读的消息后,就会启动“消息转发”机制,程序员可经由此过程告诉对象应该如何处理未知消息。

 

消息转发分两阶段:

  1、先征询接收者,所属的类是否能动态添加方法,以处理当前这个未知方法,这叫做“动态方法解析”。

  2、完整的消息转发机制。 

      1、找有没有其他对象能处理这条消息。如果有就转发给那个对象。

      2、如果没有才启动完整的消息转发机制。运行期系统把与消息有关的全部细节都封装到NSInvocation对象中,再给接收者最后一次机会,令其设法解决当前还未处理的这条消息。

 

第11条:理解objc_msgSend的作用