談?wù)凜ategory

一茉贡、作用

  • 減少單個文件體積塞栅,把不同功能整合到不同的Category中;
  • 可以按需加載腔丧;
  • 聲明私有方法放椰;
  • 把framework的私有方法公開;
這是Category數(shù)據(jù)結(jié)構(gòu)

struct category_t {
    const char *name;   / /分類名
    classref_t cls;           / /分類所屬類的類名
    struct method_list_t *instanceMethods;   / /實例方法列表
    struct method_list_t *classMethods;        / /類方法列表
    struct protocol_list_t *protocols;              / /分類所實現(xiàn)協(xié)議列表
    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底層原理探索

編譯期:存放到mach-o可執(zhí)行文件('_ DATA, _objc_const'標(biāo)識),以及方法_method_list_t

分類編譯成結(jié)構(gòu)體.png
_method_list_t結(jié)構(gòu)體詳細內(nèi)容.png
所有分類都存儲到_ _objc_catlist字段.png

運行期:加載分類,首先了解如下

  • dyld是蘋果的動態(tài)加載器衣厘,用來加載 image(注意這里 image 不是指圖片如蚜,而是 Mach-O 格式的二進制文件)。
  • 當(dāng)程序啟動時影暴,系統(tǒng)內(nèi)核首先會加載 dyld 错邦, 而 dyld 會將我們 APP 所依賴的各種庫加載到內(nèi)存空間中,其中就包括 libobjc 庫(OC和runtime), 這些工作型宙,是在 APP 的 main 函數(shù)執(zhí)行前完成的撬呢。
  • objc_init 是Object-C runtime 的入口函數(shù),在這里面主要功能是讀取 Mach-O 文件 OC 對應(yīng)的 Segment seciton 妆兑,并根據(jù)其中的數(shù)據(jù)代碼信息魂拦,完成為 OC 的內(nèi)存布局,以及初始化 runtime 相關(guān)的數(shù)據(jù)結(jié)構(gòu)搁嗓。
    image.png
    objc初始化.png
    map_image-通過之前的標(biāo)識
    _objc_catlist加載到當(dāng)前原類芯勘,把類和分類建立關(guān)聯(lián),將分類里的方法或者屬性添加到原類腺逛,通過remethodizeClass(修改method_list的結(jié)構(gòu))布局重新排列荷愕,重點方法:
    image.png
    image.png
    下圖用memmove和memcpy都可以
    image.png
    但是這里的話,用memmove會更安全(首先拷貝的時候會一個一個拷貝屉来,拷貝前兩個沒有問題路翻,當(dāng)拷貝第三個的時候,值可能已經(jīng)變了茄靠,因為拷貝第一個的時候已經(jīng)放在了第三的位置茂契,所以可能會出現(xiàn)問題)
    image.png
關(guān)聯(lián)對象

AssociationsManager管理hashMap,hashMap管理AssociationMap慨绳,屬性最終存儲在ObjcAssociation中
image.png
image.png

那我們關(guān)聯(lián)的對象是什么時候釋放的掉冶?是原對象銷毀的時候
image.png
load方法探索

調(diào)用規(guī)則

1.一個類的load方法在所有父類load方法調(diào)用之后調(diào)用真竖;
2.分類的load方法在當(dāng)前類的load方法調(diào)用之后調(diào)用;(這里不分父類的分類和子類的分類厌小,是所有分類)
3.分類load的調(diào)用順序和編譯順序有關(guān)恢共;

load方法調(diào)用(load_images)

prpare_load_methods:

從Macho文件加載類的列表,調(diào)整類的順序
image.png
最終得到存放類和分類的兩個容器璧亚;

call_load_methods:先調(diào)用類容器 loadable_classes 后調(diào)用loadable_category(與上面類和分類load調(diào)用順序就呼應(yīng)上了)
image.png
Category和extension(擴展)

1.都可以添加屬性讨韭、方法,但是category無法生成實例變量;(原則上癣蟋,category只能添加方法透硝,可利用runtime解決setter/getter問題);
2.extension在編譯時添加到類疯搅,category在運行時添加到類(所以category中的方法沒實現(xiàn)濒生,編譯器沒有警告--另外編譯期對象內(nèi)存布局已經(jīng)確定,在運行期添加變量幔欧,會破壞布局)罪治;
3.定義在 .m 文件中的類擴展方法為私有的,定義在 .h 文件(頭文件)中的類擴展方法為公有的礁蔗。

總結(jié)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末觉义,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子瘦麸,更是在濱河造成了極大的恐慌谁撼,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件滋饲,死亡現(xiàn)場離奇詭異厉碟,居然都是意外死亡,警方通過查閱死者的電腦和手機屠缭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門箍鼓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人呵曹,你說我怎么就攤上這事款咖。” “怎么了奄喂?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵铐殃,是天一觀的道長。 經(jīng)常有香客問我跨新,道長富腊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮葛峻,結(jié)果婚禮上排宰,老公的妹妹穿的比我還像新娘窟她。我一直安慰自己,他們只是感情好开泽,可當(dāng)我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布烦周。 她就那樣靜靜地躺著做粤,像睡著了一般羊异。 火紅的嫁衣襯著肌膚如雪事秀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天球化,我揣著相機與錄音秽晚,去河邊找鬼。 笑死筒愚,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的菩浙。 我是一名探鬼主播巢掺,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼劲蜻!你這毒婦竟也來了陆淀?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤先嬉,失蹤者是張志新(化名)和其女友劉穎轧苫,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疫蔓,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡含懊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了衅胀。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片岔乔。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖滚躯,靈堂內(nèi)的尸體忽然破棺而出雏门,到底是詐尸還是另有隱情,我是刑警寧澤掸掏,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布茁影,位于F島的核電站,受9級特大地震影響丧凤,放射性物質(zhì)發(fā)生泄漏募闲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一息裸、第九天 我趴在偏房一處隱蔽的房頂上張望蝇更。 院中可真熱鬧沪编,春花似錦、人聲如沸年扩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽厨幻。三九已至相嵌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間况脆,已是汗流浹背饭宾。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留格了,地道東北人看铆。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像盛末,于是被迫代替她去往敵國和親弹惦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,675評論 2 359

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

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,111評論 1 32
  • 開篇 在平時的項目中時城牡可以用到Category棠隐,在研究別人的代碼時遇見Category和Extension也是一...
    夜3033閱讀 2,836評論 4 15
  • 面向?qū)ο蟮娜筇匦裕悍庋b、繼承檐嚣、多態(tài) OC內(nèi)存管理 _strong 引用計數(shù)器來控制對象的生命周期助泽。 _weak...
    運氣不夠技術(shù)湊閱讀 1,108評論 0 10
  • 隨不經(jīng)意觸碰 擦起火花 穿過你深色衣裳 過你深色長發(fā) 抵你溫潤臉頰 此刻我心如 時雨恰逢江南 恰一路風(fēng)華 粉黛正描...
    納蘭小白閱讀 304評論 1 11
  • 我以為自己足夠勇敢 傷口裂開 鮮血會燃燒出玫瑰 然后送到情人的手上 我以為自己足夠虔誠 脊樑斷裂 憤怒會支撐起寰宇...
    風(fēng)蕭然閱讀 165評論 0 1