OC對象的本質(zhì)二-objc_class的內(nèi)部結(jié)構(gòu)

一趋观、回顧

NSObject -> isa > Class -> objc_class -> objc_object-> isa_t
isa的作用與內(nèi)部結(jié)構(gòu)(上)
isa的作用與內(nèi)部結(jié)構(gòu)(下)
了解了isa的本質(zhì)之后缀皱,再回過頭來看看,NSObject對象對應(yīng)的objc_class結(jié)構(gòu)體內(nèi)部是怎樣的

二、objc_class內(nèi)部結(jié)構(gòu)

NSObject對象的數(shù)據(jù)結(jié)構(gòu)都是存儲在objc_class內(nèi)部的控嗜,即objc_class有什么,NSObject以及 我們繼承后自定義的對象就有什么
// objc_class繼承自objc_object,所以會(huì)有一個(gè)屬性isa
struct objc_class : objc_object {
    // Class ISA;
    Class superclass; // 指向父類的地址
    cache_t cache;   // 方法緩存列表
    //結(jié)構(gòu)體,內(nèi)部存儲著主要的數(shù)據(jù),通過&不同的掩碼值獲取不同的信息地址
    class_data_bits_t bits;  
    // 獲取存放在bits中的可讀可寫的數(shù)據(jù)信息
    class_rw_t *data() { 
        return bits.data();
    }
   ......
}

objc_class的主要信息都隱藏在bits中条获,那么返回后的class_rw_t中存放的是什么呢?

struct class_rw_t {
    uint32_t flags;
    uint32_t version;
  
    const class_ro_t *ro;  // 只讀的,Class的初始信息
    method_array_t methods; // 方法列表
    property_array_t properties; // 屬性列表
    protocol_array_t protocols; // 協(xié)議列表

    Class firstSubclass;
    Class nextSiblingClass;
    char *demangledName;
}

rw_t: read write table 可讀可寫蒋歌,說明帅掘,后期我們可以向里面添加信息
class_ro_t:read only table 創(chuàng)建類的時(shí)候的初始信息

struct class_ro_t {
    uint32_t flags;
    uint32_t instanceStart;
    uint32_t instanceSize;// 大小
#ifdef __LP64__
    uint32_t reserved;
#endif

    const uint8_t * ivarLayout;
    
    const char * name;     // 類名
    method_list_t * baseMethodList; // 初始方法列表
    protocol_list_t * baseProtocols; // 初始協(xié)議列表
    const ivar_list_t * ivars; // 初始成員變量列表

    const uint8_t * weakIvarLayout;
    property_list_t *baseProperties; // 初始屬性列表
    ......
}

注意:
class_ro_t中的列表都是list_t
class_rw_t中的列表都是array_t,而且class_ro_t中多了一個(gè)ivars成員變量列表

思考:
1.class_ro_t 與class_rw_t 之間有什么聯(lián)系
2.array 與list 有什么區(qū)別和聯(lián)系

三、method_array_t 與 method_list_t

method_array_t里面存放的是 method_list_t數(shù)組堂油,所以method_array_t是一個(gè)二維數(shù)組
method_list_t里面存放是的metod_t 是一維數(shù)組

//舉例說明 array_t 和list_t的關(guān)系
class method_array_t : 
// C++的語法修档,是一種泛型,
// method_array_t里面存放的是method_list_t, 二維數(shù)組
//method_list_t 里面存放的是method_t 府框,一維數(shù)組
    public list_array_tt<method_t, method_list_t> 
{
    typedef list_array_tt<method_t, method_list_t> Super;

 public:
    method_list_t **beginCategoryMethodLists() {
        return beginLists();
    }
    
    method_list_t **endCategoryMethodLists(Class cls);

    method_array_t duplicate() {
        return Super::duplicate<method_array_t>();
    }
};

同理吱窝,property_array_t和protocol_array_t也是存放的對應(yīng)類型的二維數(shù)組

四、method_t

struct method_t {
    SEL name; // 方法選擇器迫靖,也就是方法的名字
    const char *types; // 方法的返回類型和參數(shù)
    MethodListIMP imp; // 方法的存放地址
};

五院峡、總結(jié)

1.objc_class內(nèi)部包含superclass、cache方法緩存列表系宜,bits類的信息
2.bits & 一個(gè)掩碼值才能獲取到內(nèi)部的數(shù)據(jù)
3.class_rw_t 是可讀可寫的照激,目的是方便以后可以向里面插入新的數(shù)據(jù),如分類盹牧,在程序運(yùn)行的時(shí)候俩垃,會(huì)將分類和class_ro_t中的數(shù)據(jù)按順序挪放到class_rw_t中,最終可以達(dá)到后編譯的類方法可以覆蓋先編譯的類方法
4.class_ro_t 是只讀的 汰寓,里面存放的是類的最初的信息
5.method_array_t 是二維數(shù)組里面存放的是method_list_t一維數(shù)組
6.method_list_t存放的是method_t

cache_t 方法緩存

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吆寨,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子踩寇,更是在濱河造成了極大的恐慌啄清,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異辣卒,居然都是意外死亡掷贾,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進(jìn)店門荣茫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來想帅,“玉大人,你說我怎么就攤上這事啡莉「圩迹” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵咧欣,是天一觀的道長浅缸。 經(jīng)常有香客問我,道長魄咕,這世上最難降的妖魔是什么衩椒? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮哮兰,結(jié)果婚禮上毛萌,老公的妹妹穿的比我還像新娘。我一直安慰自己喝滞,他們只是感情好阁将,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著右遭,像睡著了一般做盅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上狸演,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天言蛇,我揣著相機(jī)與錄音僻他,去河邊找鬼宵距。 笑死,一個(gè)胖子當(dāng)著我的面吹牛吨拗,可吹牛的內(nèi)容都是我干的满哪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼劝篷,長吁一口氣:“原來是場噩夢啊……” “哼哨鸭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起娇妓,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤像鸡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后哈恰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體只估,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡志群,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蛔钙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锌云。...
    茶點(diǎn)故事閱讀 40,427評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖吁脱,靈堂內(nèi)的尸體忽然破棺而出桑涎,到底是詐尸還是另有隱情,我是刑警寧澤兼贡,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布攻冷,位于F島的核電站,受9級特大地震影響紧显,放射性物質(zhì)發(fā)生泄漏讲衫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一孵班、第九天 我趴在偏房一處隱蔽的房頂上張望涉兽。 院中可真熱鬧,春花似錦篙程、人聲如沸枷畏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拥诡。三九已至,卻和暖如春氮发,著一層夾襖步出監(jiān)牢的瞬間渴肉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工爽冕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留仇祭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓颈畸,卻偏偏與公主長得像乌奇,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子眯娱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評論 2 359

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