題記
正如我們前文提到,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ā)者都看過,它很好地指出了isa和superclass在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找父類
