Object - C isa/superclass 指標
-
[參考連結] ofollow,noindex">https://www.jianshu.com/p/3e1333880dcd
前面有講過Object-C的物件分類,裡面有提到isa指標,每個類都有其對應的isa指標,如下圖所示

isa.png
- 上面紅色的虛線箭頭可以簡單地表示其對應關係
- instance的isa指向class
當呼叫物件方法時,通過instance的isa找到class,最後找到物件方法的實現進行呼叫 - class的isa指向meta-class
當呼叫類方法時,通過class的isa找到meta-class,最後找到類方法的實現進行呼叫
- instance的isa指向class
- class物件的superclass指標
既然是superclass,那就給出一些具有繼承關係的物件,具體的繼承關係如下所示:- JCStudent繼承自JCPerson 關鍵程式碼
@interface JCStudent : JCPerson<NSCoding>
- JCPerson繼承自NSObject 關鍵程式碼
@interface JCPerson : NSObject
- JCStudent繼承自JCPerson 關鍵程式碼

class_isa.png
- 上面紅色的實線箭頭可以簡單地表示其對應關係(class物件的superclass指標指向的是其父類的class物件)
- 當JCStudent的instance物件要呼叫Person的 物件方法 時,會先通過isa找到JCStudent的class,然後通過superclass找到JCPerson的class,最後找到物件方法的實現進行呼叫
- meta - class物件的superclass指標
如上繼承關係不變,具體如下所示:

meta-class_isa.png
-
上面紅色的實線箭頭可以簡單地表示其對應關係(meta-class物件的superclass指標指向的是其父類的meta-class物件)
- 當JCStudent的class要呼叫JCPerson的 類方法 時,會先通過isa找到JCStudent的meta-class,然後通過superclass找到JCPerson的meta-class,最後找到類方法的實現進行呼叫
-
isa/superclass總結簡單的總結
- 圖解如下(對應上述的繼承關係,Subclass類似JCStudent,Superclass類似JCPerson,Rootclass類似NSObject)

isa/superclass.png
-
文字解釋如下
a) instance物件的isa指向其對應的class物件
b) class物件的isa指向其對應的meta-class物件
c) meta-class的isa指向其基類的meta-class物件(上圖右側虛線所示)
d) class物件的superclass指向其父類的class物件
※如果沒有父類,superclass指向為nil
e)meta-class的superclass指向其父類的meta-class物件
※基類的meta-class的superclass指向其class物件(上圖右上方箭頭所示)
f)instance呼叫物件方法的軌跡
※通過isa找到其class物件,如果方法不存在,那麼就通過class物件的superclass找其父類,依次向上尋找,最終如果沒有找到,報錯: unrecognized selector sent to instance
g)class呼叫類方法的軌跡
※通過isa找到其meta-class物件,如果方法不存在,那麼就用過meta-class物件的superclass找其父類,依次向上尋找,如果meta-class的基類中依然沒有方法,則呼叫meta-class對應的class物件尋找,如果依舊沒有,報錯: unrecognized selector sent to instance (上圖右上返回的箭頭所示)