iOS -類探究、 isa

OC比C多了面向對象,那麼是如何做到的呢,今天大致瞭解一下類的構成。

首先要明確的一點是:oc當中類的定義也是對象,類和類的實例化對象 都是對象,所有對象都有isa指針。

typedef struct objc_class *Class;

oc的class 實質是objc_class的結構體,

再來看

isa:

一個Class類型的指針,每個實例對象的isa指針指向自己的類(Class),而Class(類)本身也是個對象,裏面也有一個isa指針指向meteClass(元類),meteClass保存了類方法列表,同時meteClass也是一個對象,也有自己的isa指針 指向根元類(root meteClass),根元類的isa指向本身。

大概理解起來就是一個實例的創建需要一個模板,這個模板就是Class,然而這個模板是怎麼製作出來的,他也需要自己的模板(meteClass),這裏理解起來的時候一定要區別於superClass,這裏不是父類的關係,差不多是模板的概念。

舉個例子:有個A類,實例化對象 a,那麼a的isa指針指向A,A裏面的isa指向A的元類 meteA ,並不是指向A的父類,meteA裏面保存了A的類方法,A裏面保存了對象方法。meteA的isa指向根源類。(這裏說這麼多是因爲很容易混淆,我之前就理解錯了)

再往下只看字面意思就大概理解了,superClass:父類,ivars:成員變量,

methodLists:方法列表

在這裏提一個問題,類方法(+方法), 對象方法(-方法)存儲在哪裏?

其實理解了類也是對象就很容易回答這個問題

首先實例化對象 上面舉例中的a的方法是存在其類(A)裏面的methodLists列表裏。

那麼A也是個實例對象 它的方法(也就是類方法)存儲在A的元類裏 meteA(這個名字是隨便起的)的methodLists列表裏面。

 

理解了類的本質,將來會比較有助於理解 KVC,KVO的實現原理,還有一些比較流行的第三方json-model映射的框架,以及一些runtime的方法。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章