Runtime-消息传递的流程机制

2019-07-17  本文已影响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指针逐级查找父类,在父类中也是先查找缓存,再查找父类
上一篇 下一篇

猜你喜欢

热点阅读