Objective C的對象模型

Objective C的對象模型

絕大多數(shù)對象繼承自NSObject,NSObject就是一個包含isa指針的結(jié)構(gòu)體次舌,

每一個id類型就是一個結(jié)構(gòu)體,可以從下圖看出


我們再看objc_class是什么彼念,


可以看出objc_class也是一個包含isa(Class類型)的指針的結(jié)構(gòu)體浅萧,并且從兼容objc1.0的代碼中可以看出來哲思,objc_class還包含了一系列的信息,比如objc_method_list(方法列表)帝簇,objc_ivar_list(成員變量列表)靠益,super_class(父類)

梳理一下,NSObject是一個包含Class指針的對象胧后,Class指針就是結(jié)構(gòu)體objc_class,然后objc_class結(jié)構(gòu)體的結(jié)構(gòu)如上圖所示纸巷。

因為Class就是objc_class,所以我們可以看出來瘤旨,每一個objc_class實際上也指向了另一個objc_class竖伯。


所以所有的對象都有一個isa實例變量,包含了這個對象的所有信息黔夭,比如objc_method_list(方法列表)羽嫡,objc_ivar_list(成員變量列表),super_class(父類)婚惫,

isa是一個指針,指向了該對象的類.實質(zhì)上,同一個類的實例,都指向同一個類對象(類也是一種特殊對象惜索,objc_class).類中包含了實例方法,也就是說,同一個類的所有實例共用了這些實例方法.消息就是發(fā)送給對象,對象轉(zhuǎn)交給其isa指向類去處理.

Objective-C的這種設計,既可以友好地實現(xiàn)面向?qū)ο?又可以有效地節(jié)約內(nèi)存.降低冗余數(shù)據(jù).對象對方法的調(diào)用是通過isa間接去調(diào)用,這樣就造成了方法調(diào)用的動態(tài)性,主要原因是:

一個對象并不曉得它能否應答一個方法,它本身既不包含方法的實現(xiàn),也不包含有方法的指針,而是間接通過isa轉(zhuǎn)到自己的類才能知道

類中的實例方法是以鏈表形式存在,運行時候,可以修改鏈表中的實例方法,

(category就是這么實現(xiàn)的箕昭,在方法鏈表里面添加函數(shù))


好绍傲,現(xiàn)在我們再梳理一下惠险,事實上捺球,當我們創(chuàng)建一個通常我們認為的對象的時候,實際上是在堆中申請了空間來存儲對象的實例變量氮兵,那么對象的實例方法方法在哪兒呢?對象將如何來相應消息呢卜高?

上文說了南片,每一個對象都有一個isa指針(objc_class,即類對象)铃绒,這個指針里面包含了所有的實例方法,那還有類方法呢矮燎?類對象也有一個isa指針赔癌,指向元類,元類就包含了類方法灾票。

可以看看這個圖(下面也有),虛線代表isa的指向既们,實線代表superclass的指向

元類(metaclass)也是一個對象正什,那么元類的isa指針又指向哪里呢?為了設計上的完整婴氮,所有的元類的isa指針都會指向一個根元類(root meta class)。所以可以把root meta class視作一個空的荣暮,沒有額外定義的類。

該圖中穗酥,最讓人困惑的莫過于Root Class了。在實現(xiàn)中迷扇,Root Class是指NSObject,我們可以從圖中看出:

NSObject類包括它的對象實例方法器一。

NSObject的元類包括它的類方法厨内,例如alloc方法。

NSObject的元類繼承自NSObject類雏胃。

一個NSObject的類中的方法同時也會被NSObject的子類在查找方法時找到。

我們可以看出root class(即NSObject)有isa的指向方仿,但是superclass的指向卻是空的统翩,所以不會循環(huán)

因為對象在內(nèi)存中的排布可以看成一個結(jié)構(gòu)體,該結(jié)構(gòu)體的大小并不能動態(tài)變化委粉。所以無法在運行時動態(tài)給對象增加成員變量娶桦。

相對的,對象的方法定義都保存在類的可變區(qū)域中衷畦。Objective-C 2.0并未在頭文件中將實現(xiàn)暴露出來,但在Objective-C 1.0中斤程,我們可以看到方法的定義列表是一個名為methodLists的指針的指針(如下圖所示)铛嘱。通過修改該指針指向的指針的值袭厂,就可以實現(xiàn)動態(tài)地為某一個類增加成員方法墨吓。這也是Category實現(xiàn)的原理纹磺。同時也說明了為什么Category只可為對象增加成員方法,卻不能增加成員變量秘症。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市役耕,隨后出現(xiàn)的幾起案子聪廉,更是在濱河造成了極大的恐慌,老刑警劉巖板熊,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件干签,死亡現(xiàn)場離奇詭異,居然都是意外死亡容劳,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門摹恨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來娶视,“玉大人,你說我怎么就攤上這事肪获。” “怎么了较木?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵青柄,是天一觀的道長。 經(jīng)常有香客問我致开,道長,這世上最難降的妖魔是什么双戳? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮魄衅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘皆撩。我一直安慰自己哲银,他們只是感情好毅访,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布喻粹。 她就那樣靜靜地躺著草巡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪山憨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天玛迄,我揣著相機與錄音棚亩,去河邊找鬼。 笑死讥蟆,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的修然。 我是一名探鬼主播质况,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼结榄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起雄妥,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤依溯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后枝秤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡淀弹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年薇溃,在試婚紗的時候發(fā)現(xiàn)自己被綠了缭乘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡堕绩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出特姐,到底是詐尸還是另有隱情黍氮,我是刑警寧澤唐含,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布觉壶,位于F島的核電站件缸,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏他炊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一蚕苇、第九天 我趴在偏房一處隱蔽的房頂上張望凿叠。 院中可真熱鬧涩笤,春花似錦、人聲如沸舱禽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽罗心。三九已至,卻和暖如春疾瓮,著一層夾襖步出監(jiān)牢的瞬間飒箭,已是汗流浹背爷贫。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工漫萄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留盈匾,地道東北人腾务。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓岩瘦,卻偏偏與公主長得像窿撬,于是被迫代替她去往敵國和親启昧。 傳聞我的和親對象是個殘疾皇子劈伴,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉跛璧,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,721評論 0 9
  • 原文出處:南峰子的技術(shù)博客 Objective-C語言是一門動態(tài)語言,它將很多靜態(tài)語言在編譯和鏈接時期做的事放到了...
    _燴面_閱讀 1,231評論 1 5
  • 本文轉(zhuǎn)載自:http://southpeak.github.io/2014/10/25/objective-c-r...
    idiot_lin閱讀 935評論 0 4
  • 我們常常會聽說 Objective-C 是一門動態(tài)語言,那么這個「動態(tài)」表現(xiàn)在哪呢座柱?我想最主要的表現(xiàn)就是 Obje...
    Ethan_Struggle閱讀 2,195評論 0 7
  • 首先說明物舒,這篇文章幾乎都是抄錄的別人的博客戏锹,簡書文章,在此總結(jié)景用,只是為了方便記憶和以后閱讀惭蹂,如果有什么失禮的地方,...
    LiYaoPeng閱讀 4,957評論 1 14