OC中消息发送机制
2017-03-17 本文已影响0人
xukunluren
OC是C的超集,所以理解OC中的消息通讯机制,首先最好理解C语言中的函数调用方式。C语言使用“静态绑定”,也就是说在编译期间就能决定运行时所应调用的函数。
在OC中,如果想某个对象传递消息,使用的是动态绑定的机制来决定需要调用的方法,在底层,所有的方法都是普通的C语言去实现,然而接收到消息之后,究竟该调用哪个方法则完全取决于运行期决定,甚至可以在程序运行时改变,这些特性使的OC成为一门真正的动态语言。
Id returnValue = [someObject messageName:parameter];
编译器会将上述语句转成C语言的函数进行编译:
Id returnValue =objc_msgSend (someObject,@selector(messageName:),parameter );
objc_msgSend函数会依据接收者与选择子的类型来调用适当的方法。其原理如下:
该方法需要在接收者所属的类中搜索其“方法列表”,如果能找到与之相符的方法,就跳至其实现代码。
若是上一步没有找到相符的方法,就沿着继承体向上查找,等找到合适的方法之后再跳转。如果还是找不到对应的方法就执行“消息转发”操作。
objc_msgSend函数会将查找到的方法缓存在“快速映射表”总,每个类都有这样的一块缓存,若是之后还会有相对于的选择字需要执行,那样方法的执行速度就会很快了。