理解 ojbc_msgSend 的作用

objc_msgSend

在 OC中,如果向某对象传递消息,那就会使用动态绑定机制来决定需调用的方法
在底层,所以的方法都是 c函数。对象接受到消息之后,调用哪一个方法,在运行期决定,甚至可以在程序运行时决定

给对象发送消息的代码

//在 oc 中发送消息就可以写成这样
id returnValue = [someObject messageName:parameter];

//编译器看到上面的代码,就会转换为 c 语言函数
void objc_msgSend(id self,SEL cmd,...) 
//可变参数,意思就是想 self这个对象发送消息


//接受者-》someObject 选择子(方法)-》messageName: 要这个接受者调用这个选择子
id returnValue = objc_msgSend(someObject,@seletor(messageName:),parameter)

原理

objc_msgSend函数会依据接收者与选择子的类型来调用适当的方法

  1. 这个函数会在接收者的类中搜寻其 方法列表.如果找到了就跳转到其实现代码。
  2. 如果没有找到,就沿着继承体系继续向上查找,等找到合照的方法再跳转
  3. 最后还是没有找到的话,就执行 消息转发

特殊情况

  • objc_msgSend_stret如果发送的消息返回的是结构体,就用这个函数处理。如果期存器能够存下这个结构体,就处理。不能的话,就消息派发。由分配在栈上的某个变量来处理消息返回的结构体
  • objc_msgSend_fpret 如果消息返回的是浮点数,就由这个函数处理
  • objc_msgSendSuper 如果要给超类发送消息。例如[super message:parameter] 就由这个函数处理 另外还有两个与上面的等效的函数。来处理super 的消息

你可能感兴趣的:(理解 ojbc_msgSend 的作用)