理解OC中的消息机制

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函数的匹配结果。这样做的目的是为了提高消息传递的效率。

你可能感兴趣的:(理解OC中的消息机制)