NSObject(一)

在Objective-C中晦攒,幾乎所有的類都是NSObject的子類狐肢,另一部分都是NSProxy的子類弃秆。
在Foundation框架下,NSObject和NSProxy兩個基類定義了類層次結(jié)構(gòu)中該類下方所有類的公共接口和行為入桂。NSProxy是專門用于實現(xiàn)代理的類奄薇。這兩個類都遵循了NSObject協(xié)議。在NSObject協(xié)議中事格,聲明了所有OC對象的公共方法。

先從結(jié)構(gòu)定義上來看

image.png
image.png

這里是NSObject的一些定義搞隐,直接在編譯器里面commend點進NSObject就可以看到,雖然有一些是標注適用Objc2.0之前驹愚。但是并不是代表之后就不存在這些參數(shù)了,只是在結(jié)構(gòu)上進一步的進行了封裝劣纲。里面有一句“ Class instead of struct objc_class *”,所以我們可以再去找找有關(guān)objc_class的源碼逢捺。

image.png

這里看到objc_class 是繼承自objc_object

image.png

image.png

從上可以看出,我們平時用的id類型癞季,其實就是一個objc_object對象劫瞳,這也是為什么id類型可以指向任何對象的原因。
然后objc_class是繼承自objc_object的绷柒,這表明其實類本質(zhì)也是一個對象志于。

這里要引入一個問題我們在調(diào)用實例方法的時候,通過類的實例對象來進行調(diào)用废睦。那調(diào)用類方法的時候伺绽,又是調(diào)用誰的實例呢?
先看看實例方法是如何別調(diào)用的嗜湃,當對象的實例方法被調(diào)用奈应,是通過isa來找到對應(yīng)的類,然后在該類的class_data_bits_t中去查找方法购披。class_data_bits_t是指向了類對象的數(shù)據(jù)區(qū)域杖挣。在該數(shù)據(jù)區(qū)域內(nèi)查找相應(yīng)方法的對應(yīng)實現(xiàn)。
對于類對象則是引入了一個元類的概念(meta-class)刚陡。
類對象的類方法調(diào)用時惩妇,通過類的 isa 在元類中獲取方法的實現(xiàn)株汉。它存儲著一個類的所有類方法。每個類都會有一個單獨的meta-class屿附,因為每個類的類方法基本不可能完全相同郎逃。
額外提兩點,第一點是在運行的時候挺份,實例是可以創(chuàng)建無數(shù)個的褒翰,但是類對象和元類對象卻是唯一的。類對象和元類對象會在main方法執(zhí)行之前就被創(chuàng)建出來匀泊。所以在工作的過程中對于廢棄了的類盡量就直接移除掉优训。這樣可以避免一些不必要的損耗。
第二點是對象的方法并沒有存儲于對象的結(jié)構(gòu)體中各聘,這個其實也比較合理揣非,如果每創(chuàng)建一個都要把相同的方法復(fù)制一遍,這樣對內(nèi)存太不友好了躲因。所以在實例方法被調(diào)用時早敬,它要通過自己持有的 isa 來查找對應(yīng)的類,然后在這里的 class_data_bits_t 結(jié)構(gòu)體中查找對應(yīng)方法的實現(xiàn)大脉。同時搞监,每一個 objc_class 也有一個指向自己的父類的指針 super_class 用來查找繼承的方法。

當實例方法被調(diào)用時镰矿,它要通過自己持有的 isa 來查找對應(yīng)的類

從網(wǎng)上找了一張NSObject的類圖


image.png

這個就是現(xiàn)在的結(jié)構(gòu)圖

接下來具體介紹一下
cache_t cache
class_data_bits_t bits

cache_t cache的源碼


image.png

這里面包含了一個bucket_t的結(jié)構(gòu)體和兩個mask_t參數(shù)
分別看看對應(yīng)的源碼


image.png
image.png
image.png

關(guān)于_mask和_occupied查資料是說
_mask:分配用來緩存bucket的總數(shù)琐驴。
_occupied:表明目前實際占用的緩存bucket的個數(shù)。

bucket_t的結(jié)構(gòu)體中存儲了一個參數(shù)與一個函數(shù)指針秤标,這個函數(shù)指針是指向一個具體的方法實現(xiàn)绝淡。

cache的作用主要是用來緩存常用的方法,當一個方法被調(diào)用的時候苍姜,會優(yōu)先在cache中查找牢酵,如果沒找到再去methodLists中查找。

class_data_bits_t
對于這個衙猪,源碼里面有一句注釋 // class_rw_t * plus custom rr/alloc flags
相當于 class_rw_t指針加上 rr/alloc 的標志茁帽。
Objc的類的屬性、方法屈嗤、以及遵循的協(xié)議在obj 2.0的版本之后都放在class_rw_t中潘拨。class_ro_t是一個指向常量的指針,存儲來編譯器決定了的屬性饶号、方法和遵守協(xié)議铁追。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市茫船,隨后出現(xiàn)的幾起案子琅束,更是在濱河造成了極大的恐慌扭屁,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涩禀,死亡現(xiàn)場離奇詭異料滥,居然都是意外死亡,警方通過查閱死者的電腦和手機艾船,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門葵腹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人屿岂,你說我怎么就攤上這事践宴。” “怎么了爷怀?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵阻肩,是天一觀的道長。 經(jīng)常有香客問我运授,道長烤惊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任吁朦,我火速辦了婚禮柒室,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘喇完。我一直安慰自己伦泥,他們只是感情好剥啤,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布锦溪。 她就那樣靜靜地躺著,像睡著了一般府怯。 火紅的嫁衣襯著肌膚如雪刻诊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天牺丙,我揣著相機與錄音则涯,去河邊找鬼。 笑死冲簿,一個胖子當著我的面吹牛粟判,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播峦剔,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼档礁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了吝沫?” 一聲冷哼從身側(cè)響起呻澜,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤递礼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后羹幸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體脊髓,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年栅受,在試婚紗的時候發(fā)現(xiàn)自己被綠了将硝。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡窘疮,死狀恐怖袋哼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情闸衫,我是刑警寧澤涛贯,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站蔚出,受9級特大地震影響弟翘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜骄酗,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一稀余、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧趋翻,春花似錦睛琳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至讨惩,卻和暖如春辟癌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背荐捻。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工黍少, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人处面。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓厂置,卻偏偏與公主長得像,于是被迫代替她去往敵國和親魂角。 傳聞我的和親對象是個殘疾皇子昵济,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

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