1. 程式人生 > >iOS - 知識梳理 (類探究、 isa)

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的方法。