理解OC中的消息机制
OC中在对象上调用方法其实就是给该对象发送一个消息,比如
Student *student = [Student new];
[student getName:name ];
【理解OC中的消息机制】例子中,可以理解为给student对象发送一个消息,其中student是接受者,getName是选择子,选择子和参数合起来就是消息。
??编译器编译的时候会把例子中的代码转换成标准的C语言函数调用,即objc_msgSend,如下:
objc_msgSend(student,@selector(getName:),name);
而obje_msgSend的原型是
void obje_msgSend(id self,SEL cmd,...)
这是一个参数个数可变的函数,能接受多个参数,第一个参数是接受者,第二个参数是选择子,后续参数是消息中的参数。obje_msgSend函数会依据接受者与选择子的类型来调用适当的方法,为了完成此操作,该方法需要在Student中遍历其方法列表,如果能找到与选择子相匹配的方法,就调至该方法的实现代码。如果找不到,那就沿着集成体系继续向上查找。如果最终还是找不到相匹配的方法,那就执行 message forwarding (消息转发)操作。
??其实在遍历Student中的方法列表之前,这个操作还会去遍历Student的 fast map,这是每个类都会有的一块缓存区域,该缓存中存放着obje_msgSend函数的匹配结果。这样做的目的是为了提高消息传递的效率。
推荐阅读
- 热闹中的孤独
- JS中的各种宽高度定义及其应用
- 深入理解Go之generate
- 考研英语阅读终极解决方案——阅读理解如何巧拿高分
- 由浅入深理解AOP
- 我眼中的佛系经纪人
- 《魔法科高中的劣等生》第26卷(Invasion篇)发售
- 危险也是机会
- python学习之|python学习之 实现QQ自动发送消息
- Android中的AES加密-下