12.8 元類meta-class

對于oc對象模型,我們清楚在運(yùn)行時(shí)一個(gè)類的對象可以通過它自身的isa指針找到它所歸屬的類节槐,比如一個(gè)NSString類的實(shí)例對象aaa,調(diào)用它的一個(gè)實(shí)例方法 [aaa substringFromIndex:1]谦炬, 實(shí)際就是向?qū)ο骯aa發(fā)送了一個(gè)消息比吭,運(yùn)行時(shí)庫會(huì)根據(jù)aaa的isa指針找到這個(gè)對象所歸屬的類,這個(gè)類包含一個(gè)所有實(shí)例方法的以及一個(gè)指向superclass的指針以便可以找到父類的實(shí)例方法严肪, 運(yùn)行時(shí)庫會(huì)在類的方法列表以及父類(們)的方法列表中尋找符合這個(gè)selector( 這里這個(gè)selector是”substringFromIndex:1")的方法史煎。找到后即運(yùn)行這個(gè)方法。關(guān)鍵點(diǎn)就是類要定義這個(gè)你發(fā)送給對象的消息)驳糯。

那么什么是 meta-class

一個(gè)oc類其實(shí)也是一個(gè)對象篇梭,意思就是你向一個(gè)類發(fā)送消息,也就是調(diào)用一個(gè)類方法比如 [NSString alloc]酝枢, 因?yàn)槊恳粋€(gè)OC的類本身也是一個(gè)對象恬偷。也就是說Class的數(shù)據(jù)結(jié)構(gòu)必然也是以isa指針開始的, 在二進(jìn)制級別上與objc_object是完全兼容的帘睦。然后一個(gè)類結(jié)構(gòu)的下一個(gè)字段一定是一個(gè)指向super class的指針(或者指向nil袍患,對于基類而言)。

一個(gè)類如何定義有很多方法竣付,依賴于你的運(yùn)行時(shí)庫版本诡延,但是不管哪種方法,他們都是以一個(gè)isa作為第一個(gè)字段卑笨,接著是superclass字段孕暇。

為了可以調(diào)用類方法,這個(gè)類的isa指針必須指向一個(gè)包含這些類方法的類結(jié)構(gòu)體赤兴。

這樣就引出了meta-class的概念:meta-class是一個(gè)類對象的類妖滔。

簡單解釋下:

   當(dāng)你向一個(gè)對象發(fā)送消息時(shí),runtime會(huì)在這個(gè)對象所屬的那個(gè)類的方法列表中查找桶良。

   當(dāng)你向一個(gè)類發(fā)送消息時(shí)座舍,runtime會(huì)在這個(gè)類的meta-class的方法列表中查找。

meta-class之所以重要陨帆,是因?yàn)樗鎯?chǔ)著一個(gè)類的所有類方法曲秉。每個(gè)類都會(huì)有一個(gè)單獨(dú)的meta-class采蚀,因?yàn)槊總€(gè)類的類方法基本不可能完全相同。

meta-class的類又是什么呢承二?

meta-class榆鼠,就像Class一樣,也是一個(gè)對象亥鸠。你依舊可以向它發(fā)送消息調(diào)用函數(shù)妆够,自然的,meta-class也會(huì)有一個(gè)isa指針指向其所屬類负蚊。所有的meta-class使用基類的meta-class作為他們的所屬類神妹。具體而言,任何NSObject繼承體系下的meta-class都使用NSObject的meta-class作為自己所屬的類家妆。

根據(jù)這個(gè)規(guī)則鸵荠,所有的meta-class使用基類的meta-class作為它們的類,而基類的meta-class也是屬于它自己伤极,也就是說基類的meta-class的isa指針指向它自己蛹找。(譯:完美的閉環(huán))

類和meta-class的繼承

就像一個(gè)類使用super_class指針指向自己的父類一樣,meta-class的super_class會(huì)指向類的super_class的meta-class塑荒。一直追溯到基類的meta-class熄赡,它的super_class會(huì)指向基類自身。

isa 和繼承的關(guān)系
image.png

結(jié)論:

meta-class是類對象的類齿税,每個(gè)類都有自己單獨(dú)的meta-class。所有的類對象并不會(huì)屬于同一個(gè)meta-class炊豪。
meta-class要保證類對象具有繼承體系中基類的所有實(shí)例和類方法凌箕,以及繼承體系中的所有中間類方法。對于所有NSObject繼承體系下的類词渤,NSObject的實(shí)例方法和協(xié)議方法對他們和他們meta-class的對象都要有效牵舱。
所有的meta-class使用基類(NSObject)的meta-class作為自己的基類,對于頂層基類的meta-class也是一樣缺虐,只是它指向自己而已芜壁。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市高氮,隨后出現(xiàn)的幾起案子慧妄,更是在濱河造成了極大的恐慌,老刑警劉巖剪芍,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件塞淹,死亡現(xiàn)場離奇詭異,居然都是意外死亡罪裹,警方通過查閱死者的電腦和手機(jī)饱普,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門运挫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人套耕,你說我怎么就攤上這事谁帕。” “怎么了冯袍?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵匈挖,是天一觀的道長。 經(jīng)常有香客問我颠猴,道長关划,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任翘瓮,我火速辦了婚禮贮折,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘资盅。我一直安慰自己调榄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布呵扛。 她就那樣靜靜地躺著每庆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪今穿。 梳的紋絲不亂的頭發(fā)上缤灵,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機(jī)與錄音蓝晒,去河邊找鬼腮出。 笑死,一個(gè)胖子當(dāng)著我的面吹牛芝薇,可吹牛的內(nèi)容都是我干的胚嘲。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼洛二,長吁一口氣:“原來是場噩夢啊……” “哼馋劈!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起晾嘶,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤妓雾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后变擒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體君珠,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年娇斑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了策添。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,133評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡唯竹,死狀恐怖乐导,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情浸颓,我是刑警寧澤物臂,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站产上,受9級特大地震影響棵磷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜晋涣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一仪媒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谢鹊,春花似錦算吩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至兼耀,卻和暖如春压昼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瘤运。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工巢音, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人尽超。 一個(gè)月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像梧躺,于是被迫代替她去往敵國和親似谁。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評論 2 355