美文网首页
Runtime-消息传递的流程机制

Runtime-消息传递的流程机制

作者: 亲爱的大倩倩 | 来源:发表于2019-07-17 20:33 被阅读0次
缓存查找流程

根据给定的方法选择器SEL,来查找bucket_t中具体的方法实现IMP

bucket_t是方法缓存器和方法实现的封装体


根据SEL去cache_t中找到bucket_t

首先根据给定的方法选择器,通过函数来映射出对应的bucket_t在数组中的位置,这一步实际是哈希查找
哈希查找实际上是通过我们给定的值,经过哈希函数算法key&mask,算出的值就是给定值在对应数组中的索引位置,提高了查找效率

查找到bucket_t之后,可以提取对应的IMP函数指针,返回给调用方

在当前类中的查找

当前类中有对应的方法列表
对于已排序好的方法列表,采用二分查找算法查找方法对应的执行函数实现
对于没有排序的列表,采用一般遍历去查找方法对应的执行函数实现

父类逐级查找
image.png

通过当前类结构的superClass成员变量去查找它的父类,把当前类转移到父类之后,需要判断父类是否为nil
NSObject的superClass就是nil
为nil则结束

若有父类,则在父类的缓存中查找对应的方法实现,根据当前方法的选择器因子,在缓存中查到了方法实现,就结束了父类逐级查找流程,若在父类缓存中没有查找到方法选择器所对应的方法实现,就需要遍历当前类的父类的方法列表,来看是否有对应的方法实现,若有则返回,若没有,继续遍历当前类的父类的父类,一直沿着superClass指针逐级向上查找,直到NSObject,取父类为nil时,就结束了查找流程

总结
  1. 缓存是否命中,缓存查找是哈希查找
  2. 当前类方法列表是否命中,已排序好的是二分查找,未排序好的是一般查找
  3. 逐级父类方法列表是否命中,根据superClass指针逐级查找父类,在父类中也是先查找缓存,再查找父类

相关文章

  • Runtime-消息传递的流程机制

    缓存查找流程 根据给定的方法选择器SEL,来查找bucket_t中具体的方法实现IMP bucket_t是方法缓存...

  • Runtime-(三)消息传递机制

    我们知道在OC中,所有的方法调用最终都会转换成objc_msgSend形式的方法调用。如下图: 而对于调用父类的方...

  • runtime-消息传递与转发机制

    参考文章:继承自NSObject的不常用又很有用的函数【重点推荐】Objective-C Runtime 1小时入...

  • 底层技术以及runtime分享

    https://minilv.github.io/2019/03/17/Runtime-消息机制土味讲解/?nsu...

  • 3-2 runtime-消息传递机制

    经典错误:unrecognized selector sent to instance 0x60400000e3e...

  • Runtime-原理

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

  • Runtime-消息机制

    Objective-C是一门动态语言,类型的判断、类的成员变量、方法的内存地址都是在程序的运行阶段才最终确定,并且...

  • runtime-消息机制

    从异常说起 我们都知道,在iOS中存在这么一个通用类类型id,它可以用来表示任何对象的类型 —— 这意味着我们使用...

  • runtime-消息机制

    OC方法调用,其实都是转换为objc_msgSend函数调用objc_msgSend的执行流程可以分为3大阶段:消...

  • iOS开发-runtime-消息传递和转发机制

    objective-c是一门动态语言,动态语言的特点就是方法的调用是在运行时(runtime)而不是编译时。 C语...

网友评论

      本文标题:Runtime-消息传递的流程机制

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