文章部分出于自己的理解圈匆,有不對(duì)的地方晤斩,希望大家指正。
實(shí)例對(duì)象我們可以看作是一個(gè)指針宴霸,實(shí)例對(duì)象通過(guò)isa指針指向類對(duì)象囱晴,類對(duì)象通過(guò)isa指針指向元類對(duì)象岸裙,類對(duì)象和元類對(duì)象本身其實(shí)都是objc_class結(jié)構(gòu)體,里面存放著我們需要的方法列表等速缆。
那么當(dāng)我們方法調(diào)用的時(shí)候降允,方法是如何緩存的呢?
當(dāng)我們方法調(diào)用的時(shí)候,首先通過(guò)isa指針找到類對(duì)象艺糜,然后在類對(duì)象的方法列表里面查找相對(duì)應(yīng)的方法剧董,找到以后會(huì)加入到我們方法緩存里面,等下次我們?cè)僬{(diào)用的時(shí)候破停,首先會(huì)先從緩存里面去查找相關(guān)方法翅楼,更加的效率。
那如果我們調(diào)用的是父類里面的方法呢真慢,其實(shí)父類對(duì)象里面的方法是不可以緩存到子類方法緩存列表里面的毅臊,所以,當(dāng)我們調(diào)用的是父類對(duì)象里面的方法的時(shí)候黑界,其方法不會(huì)在子類對(duì)象方法緩存列表里面進(jìn)行緩存管嬉。
元類對(duì)象的相關(guān)緩存同類對(duì)象。
至于緩存擴(kuò)容和具體的緩存策略:
在arm64結(jié)構(gòu)朗鸠,也就是真機(jī)環(huán)境下蚯撩,剛開(kāi)始初始化的緩存方法的容器的長(zhǎng)度2,當(dāng)容器的長(zhǎng)度小于8時(shí)烛占,是滿容量了才擴(kuò)容胎挎。當(dāng)容器的長(zhǎng)度大于8時(shí),是7/8擴(kuò)容忆家。也就是說(shuō)當(dāng)容器的長(zhǎng)度為8時(shí)犹菇,容器可以存儲(chǔ)8個(gè)方法。當(dāng)容器的長(zhǎng)度為16時(shí)芽卿,當(dāng)?shù)?5個(gè)方法需要存儲(chǔ)進(jìn)來(lái)的時(shí)候揭芍,容器就要擴(kuò)容了。
在x86_64架構(gòu)下蹬竖,剛開(kāi)始初始化的容器的長(zhǎng)度為4沼沈,是3/4擴(kuò)容。這里的3/4擴(kuò)容指的是:如果容器的長(zhǎng)度為4币厕,當(dāng)?shù)?個(gè)數(shù)據(jù)需要存儲(chǔ)的時(shí)候列另,就要擴(kuò)容了。如果容器的長(zhǎng)度為8旦装,當(dāng)?shù)?個(gè)數(shù)據(jù)需要存儲(chǔ)的時(shí)候页衙,就要擴(kuò)容了。也就是說(shuō)容器只能存儲(chǔ)容器長(zhǎng)度的3/4減1個(gè)方法。
還有一點(diǎn)就是:當(dāng)容器擴(kuò)容之后店乐,前面存儲(chǔ)的方法也會(huì)隨之清空艰躺。