Category 實(shí)現(xiàn)原理

Category的原理
  • Category編譯之后的底層結(jié)構(gòu)是struct category_t悉盆,里面存儲(chǔ)著分類的對(duì)象方法類方法规肴、屬性協(xié)議信息夜畴;
  • 在程序運(yùn)行的時(shí)候拖刃,runtime會(huì)將Category的數(shù)據(jù),合并到類信息中(類對(duì)象贪绘、元類對(duì)象中)序调。

無論你創(chuàng)建了多少個(gè)分類,分類中有多少對(duì)象方法或類方法,程序運(yùn)行時(shí), 通過runtime動(dòng)態(tài)將分類

  • 對(duì)象方法都統(tǒng)一合并到類中兔簇;
  • 類方法都統(tǒng)一合并到元類中发绢。

Category的底層結(jié)構(gòu):

1、當(dāng)程序編譯的時(shí)候垄琐,Category都會(huì)變成如下結(jié)構(gòu)體:

struct _category_t {
    const char *name;
    struct _class_t *cls;
    const struct _method_list_t *instance_methods;
    const struct _method_list_t *class_methods;
    const struct _protocol_list_t *protocols;
    const struct _prop_list_t *properties;
};
  • 文件目錄下边酒,終端執(zhí)行xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc OC源文件 -o 輸出的CPP文件

2、源碼

struct category_t {
    const char *name;
    classref_t cls;
    struct method_list_t *instanceMethods;
    struct method_list_t *classMethods;
    struct protocol_list_t *protocols;
    struct property_list_t *instanceProperties;
    // Fields below this point are not always present on disk.
    struct property_list_t *_classProperties;

    method_list_t *methodsForMeta(bool isMeta) {
        if (isMeta) return classMethods;
        else return instanceMethods;
    }

    property_list_t *propertiesForMeta(bool isMeta, struct header_info *hi);
};

Category的加載處理過程:
  1. 通過Runtime加載某個(gè)類的所有Category數(shù)據(jù);

  2. 把所有Category方法狸窘、屬性墩朦、協(xié)議數(shù)據(jù),合并到一個(gè)大數(shù)組中,(后面參與編譯的Category數(shù)據(jù)翻擒,會(huì)在數(shù)組的前面)氓涣。

  3. 將合并后的分類數(shù)據(jù)(方法牛哺、屬性協(xié)議)劳吠,插入到類原來數(shù)據(jù)的前面引润。

所以,如果Category中重寫了類中的方法痒玩,那該方法的調(diào)用順序 淳附?
  • 只調(diào)用分類中重寫了的方法。
  • 且眾多分類中蠢古,只會(huì)調(diào)用最后編譯(編譯順序奴曙,Xcode: Build Phases --> Compile Sources)的分類中的方法。
原理:
  • 方法的實(shí)現(xiàn)是消息發(fā)送機(jī)制草讶,objc_msgSend([Object Class], @selector(test));
  • 以類方法為例洽糟,消息發(fā)送機(jī)制是通過isa找到元類對(duì)象,在元類對(duì)象類方法列表中(包含了分類方法的列表)按順序遍歷查找方法堕战,順序就是:
    1.Category數(shù)據(jù)在插到類的前面脊框;
    2.Category誰最后編譯,誰在前践啄。

??:分類和類中的+load方法都會(huì)調(diào)用


Category(分類)和Extension(類擴(kuò)展)的區(qū)別:
  • 類擴(kuò)展里的內(nèi)容是編譯的時(shí)候浇雹,就已經(jīng)合并到類中去了;
  • 而分類里的內(nèi)容是程序運(yùn)行時(shí)屿讽,通過Runtime將內(nèi)容合并到類中昭灵。

Category可以添加成員變量嗎 ?
  • 不可以伐谈;
  • 因?yàn)榉诸惖牡讓咏Y(jié)構(gòu)中烂完,沒有用來存放成員變量的list。
  • 如果給分類添加屬性诵棵,只會(huì)生成聲明抠蚣,set和get方法不會(huì)實(shí)現(xiàn)。

如何實(shí)現(xiàn)給分類添加"成員變量"履澳?
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嘶窄,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子距贷,更是在濱河造成了極大的恐慌柄冲,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件忠蝗,死亡現(xiàn)場(chǎng)離奇詭異现横,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門戒祠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來骇两,“玉大人,你說我怎么就攤上這事姜盈〉颓В” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵贩据,是天一觀的道長栋操。 經(jīng)常有香客問我闸餐,道長饱亮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任舍沙,我火速辦了婚禮近上,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拂铡。我一直安慰自己壹无,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布感帅。 她就那樣靜靜地躺著斗锭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪失球。 梳的紋絲不亂的頭發(fā)上岖是,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音实苞,去河邊找鬼豺撑。 笑死,一個(gè)胖子當(dāng)著我的面吹牛黔牵,可吹牛的內(nèi)容都是我干的聪轿。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼猾浦,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼陆错!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起金赦,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤危号,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后素邪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體外莲,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了偷线。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片磨确。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖声邦,靈堂內(nèi)的尸體忽然破棺而出乏奥,到底是詐尸還是另有隱情,我是刑警寧澤亥曹,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布邓了,位于F島的核電站,受9級(jí)特大地震影響媳瞪,放射性物質(zhì)發(fā)生泄漏骗炉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一蛇受、第九天 我趴在偏房一處隱蔽的房頂上張望句葵。 院中可真熱鬧,春花似錦兢仰、人聲如沸乍丈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽轻专。三九已至,卻和暖如春察蹲,著一層夾襖步出監(jiān)牢的瞬間请垛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工递览, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留叼屠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓绞铃,卻偏偏與公主長得像镜雨,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子儿捧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

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

  • 2019-08-11 姓名:王素琴 公司:阜陽市豹子頭服飾科技有限公司 【日精進(jìn)打卡第447天 【知~學(xué)習(xí)】 姓...
    竹子在加油閱讀 192評(píng)論 0 0
  • 月12日19時(shí)56分農(nóng)歷:二零一九年 七月 十二日 戌時(shí)干支:己亥壬申辛巳戊戌當(dāng)月節(jié)氣:立秋:2019年08月08...
    石放閱讀 152評(píng)論 0 1
  • 2019-10-03 周賢清 公司:海南蔚藍(lán)時(shí)代實(shí)業(yè)有限公司 “六項(xiàng)精進(jìn)”365期利他一組 《日精進(jìn)打卡第536天...
    周賢清閱讀 308評(píng)論 0 0
  • 2019-08-21 利他2組打卡: 姓名:李旭 揚(yáng)州市方圓建筑工程有跟公司 【日精進(jìn)打卡第512天荚坞,開始于20...
    嫣然如夢(mèng)_1dac閱讀 537評(píng)論 0 0
  • 姓名:葉彩霞 【日精進(jìn)打卡第489天】2019.08.12 第367期(無錫市) 樂觀三組 學(xué)員 【知~學(xué)習(xí)】 ...
    透明的水泡閱讀 139評(píng)論 0 0