首页 > 代码库 > 第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的作用