iOS底層原理之四:isa和superclass指針(一)

題記

正如我們前文提到,OC的每個(gè)對像中都會(huì)有一個(gè)isa指針,每個(gè)類中都會(huì)有一個(gè)superclass指針,那么它們有什么用?實(shí)例對象,類對象,元類對象之間又有什么聯(lián)系呢?

正題


isa指針

首先我們準(zhǔn)備一個(gè)繼承自NSObject的JJPerson類,定義一個(gè)對象方法和一個(gè)類方法,然后我們分別調(diào)用這兩個(gè)方法。


但正如我們前文提到,類方法實(shí)際在元類對象中而不是類中,對象方法實(shí)際存放在類中而不是實(shí)例對象中,那它們分別是怎么調(diào)用到并沒有存放在自身的東西呢?這時(shí)候就是isa指針發(fā)揮作用了。


如上圖我們看到:

  • instance的isa指向class

  • 當(dāng)調(diào)用對象方法時(shí),通過instance的isa找到class,最后找到對象方法的實(shí)現(xiàn)進(jìn)行調(diào)用

  • class的isa指向meta-class

  • 當(dāng)調(diào)用類方法時(shí),通過class的isa找到meta-class,最后找到類方法的實(shí)現(xiàn)進(jìn)行調(diào)用
    OC對象就可以通過isa指針這樣串聯(lián)起來

superclass指針

我們把問題變得稍微復(fù)雜一些,我們?yōu)镴JPerson增加一個(gè)子類JJStudent,同樣順手為它準(zhǔn)備一個(gè)對象方法和一個(gè)類方法。


正如我們所知,student繼承自person,它是可以調(diào)用父類的方法的。

但是Person的對象方法和類方法都是存放在Person的類對象和元類對象中,Student的類和實(shí)例對象是怎么調(diào)用它們的呢?這樣的情況下isa指針看起來已經(jīng)不能滿足我們的需求了,那這時(shí)候就需要superclass指針。

  • 當(dāng)Student的instance對象要調(diào)用Person的對象方法時(shí),會(huì)先通過isa找到Student的class,然后通過superclass找到Person的class,最后找到對象方法的實(shí)現(xiàn)進(jìn)行調(diào)用


  • 當(dāng)Student的class要調(diào)用Person的類方法時(shí),會(huì)先通過isa找到Student的meta-class,然后通過superclass找到Person的meta-class,最后找到類方法的實(shí)現(xiàn)進(jìn)行調(diào)用

總結(jié)


這張經(jīng)典的圖相信很多iOS開發(fā)者都看過,它很好地指出了isasuperclass在OC對象之間所擔(dān)任的聯(lián)系


綜合我們上面提到的例子,我們可以為這張圖加上備注方便理解

  • instance的isa指向class

  • class的isa指向meta-class

  • meta-class的isa指向基類的meta-class

  • 基類的meta-class的isa指向自己

  • class的superclass指針指向父類(如果沒有父類則指向nil)

  • meta-class的superclass指向父類的meta-class

  • 基類的meta-class的superclass指向基類的class(NSObject)

instance調(diào)用對象方法的軌跡
isa找到class,方法不存在,就通過superclass找父類
class調(diào)用類方法的軌跡
isa找meta-class,方法不存在,就通過superclass找父類
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容