美文网首页
objc_msgSend

objc_msgSend

作者: 杏壳 | 来源:发表于2016-10-11 09:28 被阅读34次

    OC中消息的概念

    OC中在对象上调用方法,用OC的术语叫“传递消息”。在OC中,如果向某对象传递消息,会使用动态绑定机制来决定需要调用的方法。在底层,都是普通的C语言函数,对象收到消息后,到底该调用哪个方法,完全由运行期决定,甚至可以在运行时改变,这种特性使得OC成为真正的动态语言。
    发送消息可以用下面的代码来表示:

    id returnValue = [someObject messageName:parameter];
    

    这条语句表示向someObject发送了一个消息。someObject我们成为“消息接收者”(recevier),message我们称为“选择子”(selector)。选择子和参数合起来我们称之为消息(message)

    objc_msgSend的作用

    编译器会将上述语句转换为一个标准的C语言函数调用,如下:

    id objc_msgSend(id self, SEL cmd, ...);
    

    这是一个参数可变的函数,第一个参数代表接收者,第二个参数代表选择子,后面的参数就是消息中的参数,顺序不变。
    objc_msgSend函数会依据接收者与选择子的类型来调用适当的方法。该方法需在接收者所属的类中搜寻“方法列表”,如果能找到与选择子名称相符的方法,就跳转至实现代码。如果找不到,则沿着继承体系向上找。如果还是找不到,则执行性“消息转发”。
    还有一些属于其他“边界情况”的消息调用过程,由另一些函数来处理

    • objc_msgSend_fpret: 返回浮点数
    • objc_msgSend_stret: 返回值为结构体
    • objc_msgSendSuper:向父类发消息,例如:[super message:parameter],那么就交由此函数来处理。也有另外两个与objc_msgSend_stret和objc_msgSend_fpret等效的函数,用于处理发给super的相应消息。

    深入阅读

    Objective-C 消息发送与转发机制原理
    OCRuntime

    相关文章

      网友评论

          本文标题:objc_msgSend

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