美文网首页
Runtime消息发送

Runtime消息发送

作者: Queen_BJ | 来源:发表于2020-05-08 16:30 被阅读0次

对象方法的调用就是向这个对象发送消息

typedef struct objc_method *Method;
struct objc_method {
    SEL method_name                                          OBJC2_UNAVAILABLE;
    char *method_types                                       OBJC2_UNAVAILABLE;
    IMP method_imp                                           OBJC2_UNAVAILABLE;
}

objc_method这个结构体的内容:

  • SEL method_name 方法名
  • char *method_types 方法类型
  • IMP method_imp 方法实现

消息格式

objc_msgSend("对象","SEL","参数"...)

寻找IMP的过程:

先从当前class的cache方法列表(cache methodLists)里去找。
如果找到了,跳到对应函数实现。
如果没找到,就从class的方法列表(methodLists)里找。
如果还找不到,就到super class的方法列表里找,直到找到基类(NSObject)为止。
最后再找不到,就会进入动态方法解析和消息转发的机制。

消息传递的流程:缓存查找-->当前类查找-->父类逐级查找

  • 类对象存储实例方法列表等信息
  • 元类对象存储类方法列表等信息

详细过程

  • 调用方法之前,先去查找缓存,看看缓存中是否有对应选择器的方法实现,如果有,就去调用函数,完成消息传递(缓存查找:给定值SEL,目标是查找对应bucket_t中的IMP,哈希查找)
  • 如果缓存中没有,会根据当前实例的isa指针查找当前类对象的方法列表,看看是否有同样名称的方法 ,如果找到,就去调用函数,完成消息传递(当前类中查找:对于已排序好的方法列表,采用二分查找,对于没有排序好的列表,采用一般遍历)
  • 如果当前类对象的方法列表没有,就会逐级父类方法列表中查找,如果找到,就去调用函数,完成消息传递(父类逐级查找:先判断父类是否为nil,为nil则结束,否则就继续进行缓存查找-->当前类查找-->父类逐级查找的流程)
  • 如果一直查到根类依然没有查找到,则进入到消息转发流程中,完成消息传递

相关文章

  • Runtime --- 消息发送

    上篇内容我们主要了解了objc_msgSend方法的几个参数和objc_class的结构本篇内容我们一起了解 消息...

  • runtime消息发送

    一、runtime简介 RunTime简称运行时。OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消...

  • Runtime 消息发送

    1、isa 详解 isa 在 arm64 架构之前就是一个普通的指针,存储着 Class、Meta-Class 对...

  • Runtime消息发送

    对象方法的调用就是向这个对象发送消息 objc_method这个结构体的内容: SEL method_name 方...

  • Runtime — 消息发送

    一、Runtime 1. Runtime介绍 Objective-C 是一门动态语言,而承载整个 OC 动态特性的...

  • Runtime-原理

    runtime初探对象与方法的本质runtime-消息发送runtime-动态方法解析runtime-消息转发 r...

  • runtime objc_msgSend使用

    前言 想要通过runtime发送消息,就必须要掌握runtime如何发送消息,是调用哪个函数?又是如何调用的?本篇...

  • objc_msgSend发送消息 动态添加函数

    前言想要通过runtime发送消息,就必须要掌握runtime如何发送消息,是调用哪个函数?又是如何调用的?本篇文...

  • iOS objc_msgSend详解

    前言想要通过runtime发送消息,就必须要掌握runtime如何发送消息,是调用哪个函数?又是如何调用的?本篇文...

  • runtime的消息机制

    任何方法调用本质:发送一个消息,用runtime发送消息,OC底层实现通过runtime实现; 我们平时书写的代码...

网友评论

      本文标题:Runtime消息发送

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