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

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

NSObject對象的數(shù)據(jù)結(jié)構(gòu)都是存儲在objc_class內(nèi)部的保屯,即objc_class有什么,NSObject以及 我們繼承后自定義的對象就有什么

// objc_class繼承自objc_object,所以會有一個(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)系

2赋焕、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ù)組

3侨嘀、method_t

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

4、總結(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í)候,會將分類和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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市火鼻,隨后出現(xiàn)的幾起案子室囊,更是在濱河造成了極大的恐慌雕崩,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件融撞,死亡現(xiàn)場離奇詭異盼铁,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)尝偎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門捉貌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人冬念,你說我怎么就攤上這事趁窃。” “怎么了急前?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵醒陆,是天一觀的道長。 經(jīng)常有香客問我裆针,道長刨摩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任世吨,我火速辦了婚禮澡刹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘耘婚。我一直安慰自己罢浇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布沐祷。 她就那樣靜靜地躺著嚷闭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪赖临。 梳的紋絲不亂的頭發(fā)上胞锰,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機(jī)與錄音兢榨,去河邊找鬼嗅榕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛吵聪,可吹牛的內(nèi)容都是我干的凌那。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼暖璧,長吁一口氣:“原來是場噩夢啊……” “哼案怯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起澎办,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤嘲碱,失蹤者是張志新(化名)和其女友劉穎金砍,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體麦锯,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡恕稠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了扶欣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鹅巍。...
    茶點(diǎn)故事閱讀 39,841評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖料祠,靈堂內(nèi)的尸體忽然破棺而出骆捧,到底是詐尸還是另有隱情,我是刑警寧澤髓绽,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布敛苇,位于F島的核電站,受9級特大地震影響顺呕,放射性物質(zhì)發(fā)生泄漏枫攀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一株茶、第九天 我趴在偏房一處隱蔽的房頂上張望来涨。 院中可真熱鬧,春花似錦启盛、人聲如沸蹦掐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽笤闯。三九已至堕阔,卻和暖如春棍厂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背超陆。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人小泉。 一個(gè)月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓晴玖,卻偏偏與公主長得像,于是被迫代替她去往敵國和親谨娜。 傳聞我的和親對象是個(gè)殘疾皇子航攒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評論 2 354