1. 程式人生 > >【OC底層】OC物件本質,如 isa, super-class

【OC底層】OC物件本質,如 isa, super-class

 注:class 物件和 meta-class 物件都是 Class 型別的,它們其實結構都是一樣的,class物件中一樣會包含 類方法,只不過那個類方法是 空的而已。

   同樣,meta-class物件中也有 類的屬性、物件方法、協議、成員變數,不過那些對應的值也都是空

isa指標

上面我們通過原始碼可以看到每個物件都有一個 isa 指標,isa指標作用是幹嘛的呢?

通過上圖可以看出:

  1> instanceisa指向class    當呼叫物件方法時,通過instanceisa找到class,最後找到物件方法的實現進行呼叫

  2> classisa

指向meta-class

    當呼叫類方法時,通過classisa找到meta-class,最後找到類方法的實現進行呼叫

class物件的superclass指標

superclass是用於找父類的,比如子類呼叫某個方法,如果子類中沒有,就會去父類找,底層就是通過superclass找到父類的,如下圖:

 當Studentinstance物件要呼叫Person的物件方法時,會先通過isa找到Studentclass,然後通過superclass找到Person的class,最後找到物件方法的實現進行呼叫

 meta-class物件的superclass指標

 meta-class中的superclass基本和 class物件中的一樣,不過有一點點區別,如圖:

 

  當Student的class要呼叫Person的類方法時,會先通過isa找到Student的meta-class,然後通過superclass找到Person的meta-class,最後找到類方法的實現進行呼叫

  有什麼區別呢?從這圖可能看不出來,區別就是如果基類meta-class中都找不到類方法,那麼它就會去從基類物件裡面去找物件方法,OC的底層其實是不區分 物件方法與類方法的。

isa、superclass總結 

 

這張圖能夠清楚的描述 isa和superclass的作用和關係,下面是備註了一下,看得更加懂點。

 

  • instance的isa指向的是class物件
  • class的isa指向的是meta-class物件
  • meta-class的isa指向的是基類的meta-class物件
  • class的superclass指向的是父類的class物件,如果沒有父類,superclass指標為nil
  • meta-class的superclass指向的是父類的meta-class物件
  • 基類的meta-class指向的是基類的class物件(重點)

  instance呼叫物件方法的軌跡:

  例項物件會先通過isa找到class物件,判斷裡面有沒有要呼叫的方法,如果有就直接呼叫,沒有就會通過class物件中的superclass找到父類,然後在父類中判斷是否有該方法,如果還沒有就接著往上找。

   class呼叫類方法的軌跡:

   isa找meta-class,方法不存在,就通過superclass找父類,最後基類mate-class也沒有的話還會去基類物件找

 isa指標的一些問題

 上面已經說到了instance物件的isa指標指向的是class物件,那就是說instance物件的isa指標記憶體地址是不是就是class物件的記憶體地址呢?

 如果在以前的32位系統中確實如此,在64位系統中不是的,裡面有一個點操作, ISA_MASK

  其中arm64和x86架構的這個 ISA_MASK的偏移地址是不一樣的,如下圖:

 

 class、meta-class物件的本質結構都是struct objc_class,如下圖: