美文网首页
理解 ojbc_msgSend 的作用

理解 ojbc_msgSend 的作用

作者: bamboomoon | 来源:发表于2016-09-18 14:01 被阅读0次

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 的作用

    objc_msgSend 在 OC中,如果向某对象传递消息,那就会使用动态绑定机制来决定需调用的方法在底层,所以的...

  • javascript基础知识问答-作用域和闭包

    1.理解词法作用域和动态作用域2.理解JavaScript的作用域和作用域链3.理解JavaScript的执行上下...

  • 作用域的理解

    前几天面试遇到这个问题: 打印结果是undefined,2,3其实我知道作用域会变量提升,把var放到最前面,可是...

  • yield的作用理解

    Python中的yield和java中的不同,java中的yield是妥协的意味,让出cpu给其他线程执行,但不保...

  • 2018-07-11

    深入理解闭包: 一、变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域。 变量的作用域无非...

  • JavaScript 函数闭包(colsure)

    理解闭包,你首先必须理解JS的变量作用域,JavaScript作用域和作用域链。 ES6之前,变量的作用域分为全局...

  • js闭包

    一.变量的作用域 要理解闭包,首先必须理解JavaScript特殊的变量作用域。 作用域无非就是两种:全局作用域和...

  • 5分钟入门闭包

    理解闭包前先要理解两个概念:作用域和作用域链。一、作用域分为: 全局作用域 函数作用域 var a = 100 f...

  • Javascript-学习闭包

    一、变量的作用域要理解闭包,首先必须理解javascript特殊的变量作用域,变量作用域有两种:全局作用域和局部作...

  • JavaScript中的闭包

    理解闭包,首先必须理解变量作用域。前面提到,JavaScript 有两种作用域:全局作用域和函数作用域。函数内部可...

网友评论

      本文标题:理解 ojbc_msgSend 的作用

      本文链接:https://www.haomeiwen.com/subject/untgettx.html