OC中在对象上调用方法其实就是给该对象发送一个消息,比如
Student *student = [Student new];
[student getName:name ];
例子中,可以理解为给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函数的匹配结果。这样做的目的是为了提高消息传递的效率。