
緩存查找流程
根據(jù)給定的方法選擇器SEL,來查找bucket_t中具體的方法實(shí)現(xiàn)IMP
bucket_t是方法緩存器和方法實(shí)現(xiàn)的封裝體

根據(jù)SEL去cache_t中找到bucket_t
首先根據(jù)給定的方法選擇器,通過函數(shù)來映射出對應(yīng)的bucket_t在數(shù)組中的位置,這一步實(shí)際是哈希查找
哈希查找實(shí)際上是通過我們給定的值,經(jīng)過哈希函數(shù)算法key&mask,算出的值就是給定值在對應(yīng)數(shù)組中的索引位置,提高了查找效率
查找到bucket_t之后,可以提取對應(yīng)的IMP函數(shù)指針,返回給調(diào)用方
在當(dāng)前類中的查找
當(dāng)前類中有對應(yīng)的方法列表
對于已排序好的方法列表,采用二分查找算法查找方法對應(yīng)的執(zhí)行函數(shù)實(shí)現(xiàn)
對于沒有排序的列表,采用一般遍歷去查找方法對應(yīng)的執(zhí)行函數(shù)實(shí)現(xiàn)
父類逐級查找

通過當(dāng)前類結(jié)構(gòu)的superClass成員變量去查找它的父類,把當(dāng)前類轉(zhuǎn)移到父類之后,需要判斷父類是否為nil
NSObject的superClass就是nil
為nil則結(jié)束
若有父類,則在父類的緩存中查找對應(yīng)的方法實(shí)現(xiàn),根據(jù)當(dāng)前方法的選擇器因子,在緩存中查到了方法實(shí)現(xiàn),就結(jié)束了父類逐級查找流程,若在父類緩存中沒有查找到方法選擇器所對應(yīng)的方法實(shí)現(xiàn),就需要遍歷當(dāng)前類的父類的方法列表,來看是否有對應(yīng)的方法實(shí)現(xiàn),若有則返回,若沒有,繼續(xù)遍歷當(dāng)前類的父類的父類,一直沿著superClass指針逐級向上查找,直到NSObject,取父類為nil時(shí),就結(jié)束了查找流程
總結(jié)
- 緩存是否命中,緩存查找是哈希查找
- 當(dāng)前類方法列表是否命中,已排序好的是二分查找,未排序好的是一般查找
- 逐級父類方法列表是否命中,根據(jù)superClass指針逐級查找父類,在父類中也是先查找緩存,再查找父類