方法緩存的查找流程,實(shí)際上就是按照給定的SEL,在方法緩存列表中找到對(duì)應(yīng)的bucket_t中的IMP。對(duì)應(yīng)的流程就是:

Xnip2018-10-24_17-17-09.png
我們通過(guò)給定的方法映射出方法在bucket_t中的位置,這個(gè)查找的方式,實(shí)際上就是哈希查找。其查找方式,就是根據(jù)給定的值,與對(duì)應(yīng)的mask(cache_t中的一個(gè)成員變量)做位與操作然后計(jì)算,取得的一個(gè)值。然后在bucket_t中找到對(duì)應(yīng)的IMP,返回給調(diào)用方就可以了。
在當(dāng)前類(lèi)中查找方法分兩種情況:
- 對(duì)于
已排序好的列表,采用二分查找算法查找方法對(duì)應(yīng)執(zhí)行函數(shù)。 - 對(duì)于
沒(méi)有排序的列表,采用一般遍歷查找方法對(duì)應(yīng)的執(zhí)行函數(shù)。
父類(lèi)逐級(jí)查找流程

Xnip2018-10-24_17-34-38.png
- 當(dāng)前類(lèi)對(duì)象先找到父類(lèi)對(duì)象
- 判斷父類(lèi)對(duì)象是否為nil,如果是nil,則結(jié)束方法查找
- 如果父類(lèi)不為nil,查找父類(lèi)方法緩存,找到則返回并結(jié)束
- 如果未在父類(lèi)緩存中找到方法,則在父類(lèi)方法列表中查找,找到則返回并結(jié)束
- 如果父類(lèi)方法列表中沒(méi)有此方法,則重復(fù)到1,循環(huán)此流程