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

根据SEL去cache_t中找到bucket_t
首先根据给定的方法选择器,通过函数来映射出对应的bucket_t在数组中的位置,这一步实际是哈希查找
哈希查找实际上是通过我们给定的值,经过哈希函数算法key&mask,算出的值就是给定值在对应数组中的索引位置,提高了查找效率
查找到bucket_t之后,可以提取对应的IMP函数指针,返回给调用方
在当前类中的查找
当前类中有对应的方法列表
对于已排序好的方法列表,采用二分查找算法查找方法对应的执行函数实现
对于没有排序的列表,采用一般遍历去查找方法对应的执行函数实现
父类逐级查找

通过当前类结构的superClass成员变量去查找它的父类,把当前类转移到父类之后,需要判断父类是否为nil
NSObject的superClass就是nil
为nil则结束
若有父类,则在父类的缓存中查找对应的方法实现,根据当前方法的选择器因子,在缓存中查到了方法实现,就结束了父类逐级查找流程,若在父类缓存中没有查找到方法选择器所对应的方法实现,就需要遍历当前类的父类的方法列表,来看是否有对应的方法实现,若有则返回,若没有,继续遍历当前类的父类的父类,一直沿着superClass指针逐级向上查找,直到NSObject,取父类为nil时,就结束了查找流程
总结
- 缓存是否命中,缓存查找是哈希查找
- 当前类方法列表是否命中,已排序好的是二分查找,未排序好的是一般查找
- 逐级父类方法列表是否命中,根据superClass指针逐级查找父类,在父类中也是先查找缓存,再查找父类
网友评论