文章部分出于自己的理解,有不對的地方,希望大家指正。
實例對象我們可以看作是一個指針,實例對象通過isa指針指向類對象,類對象通過isa指針指向元類對象,類對象和元類對象本身其實都是objc_class結構體,里面存放著我們需要的方法列表等。
那么當我們方法調用的時候,方法是如何緩存的呢?
當我們方法調用的時候,首先通過isa指針找到類對象,然后在類對象的方法列表里面查找相對應的方法,找到以后會加入到我們方法緩存里面,等下次我們再調用的時候,首先會先從緩存里面去查找相關方法,更加的效率。
那如果我們調用的是父類里面的方法呢,其實父類對象里面的方法是不可以緩存到子類方法緩存列表里面的,所以,當我們調用的是父類對象里面的方法的時候,其方法不會在子類對象方法緩存列表里面進行緩存。
元類對象的相關緩存同類對象。
至于緩存擴容和具體的緩存策略:
在arm64結構,也就是真機環(huán)境下,剛開始初始化的緩存方法的容器的長度2,當容器的長度小于8時,是滿容量了才擴容。當容器的長度大于8時,是7/8擴容。也就是說當容器的長度為8時,容器可以存儲8個方法。當容器的長度為16時,當?shù)?5個方法需要存儲進來的時候,容器就要擴容了。
在x86_64架構下,剛開始初始化的容器的長度為4,是3/4擴容。這里的3/4擴容指的是:如果容器的長度為4,當?shù)?個數(shù)據(jù)需要存儲的時候,就要擴容了。如果容器的長度為8,當?shù)?個數(shù)據(jù)需要存儲的時候,就要擴容了。也就是說容器只能存儲容器長度的3/4減1個方法。
還有一點就是:當容器擴容之后,前面存儲的方法也會隨之清空。