Runtime系列(類與元類)
如果你讀過(guò) Runtime系列(引文),可能會(huì)在其中發(fā)現(xiàn)一個(gè)詞:類對(duì)象。那么什么是類對(duì)象?
先看一段代碼
- NSArray *arr = [NSArray array];
他是怎么運(yùn)行的?
上篇文章中提到,[receiver message]底層會(huì)調(diào)用id objc_msgSend(id self, SEL op, ...)。再來(lái)回顧一下id是什么
- struct objc_object {
- Class isa OBJC_ISA_AVAILABILITY;
- };
- typedef struct objc_object *id;
id指向一個(gè)對(duì)象,可以猜測(cè)[NSArray array]中的NSArray也是一個(gè)對(duì)象??蒒SArray怎么會(huì)是對(duì)象?這就要引出本文的另一個(gè)主角元類了。
元類
其實(shí)NSArray和arr一樣,也是對(duì)象,叫做類對(duì)象。
可以看到,Class中也有個(gè)isa指針,他的指向就是自身的元類。
元類是類對(duì)象的類,類對(duì)象是元類的實(shí)例。
基于這種設(shè)計(jì)模式,不難發(fā)現(xiàn):
1.我們以前調(diào)用 "+" 開(kāi)頭的類方法實(shí)際是在調(diào)用元類的對(duì)象方法 2.由于每個(gè)類有且只有一個(gè),所以每個(gè)類對(duì)象都是其對(duì)應(yīng)元類的單例
那么,元類是對(duì)象嗎?
答案是肯定的,元類是對(duì)象。
如果元類也是對(duì)象,元類的類又是什么?
元類的類
再來(lái)看一張網(wǎng)上的示意圖
- 圖解
目前我所接觸到的oc對(duì)象都繼承自NSObject,不知道是否還有其他的Root class,這里以NSObject為例。
1.每個(gè)實(shí)例對(duì)象的類都是類對(duì)象,每個(gè)類對(duì)象的類都是元類對(duì)象,每個(gè)元類對(duì)象的類都是根元類(root meta class的isa指向自身) 2.類對(duì)象的父類最終繼承自根類對(duì)象NSObject,NSObject的父類為nil 3.元類對(duì)象(包括根元類)的父類最終繼承自根類對(duì)象NSObject
可見(jiàn),類與元類是一個(gè)閉環(huán)。