iOS OC中分類Category實現(xiàn)原理

//聯(lián)系人:石虎?QQ:1224614774?昵稱:嗡嘛呢叭咪哄

一您朽、概念

1.前言

category是Objective-C?2.0之后添加的語言特性肥照,

category的主要作用是為已經(jīng)存在的類添加方法。

2.設(shè)計思想

?Objective-C 中的 Category 就是對裝飾模式的一種具體實現(xiàn)世落。它的主要作用是在不改變原有類的前提下,動態(tài)地給這個類添加一些方法。

在 Objective-C 中的具體體現(xiàn)為:實例(類)方法父泳、屬性和協(xié)議般哼。

二、使用場景

1.給現(xiàn)有的類添加方法惠窄;

2.將一個類的實現(xiàn)拆分成多個獨立的源文件;

?好處:

? a)可以減少單個文件的體積

? b)可以把不同的功能組織到不同的category里

? c)可以由多個開發(fā)者共同完成一個類

? d)可以按需加載想要的category 等等蒸眠。

3.聲明私有的方法。

三杆融、實現(xiàn)原理

1.我們不主動引入 Category 的頭文件楞卡,Category 中的方法都會被添加進主類中。我們可以通過?- performSelector:?等方式 對 Category 中的相應(yīng)方法進行調(diào)用

?a)將 Category 和它的主類(或元類)注冊到哈希表中脾歇;

?b)如果主類(或元類)已實現(xiàn)蒋腮,那么重建它的方法列表。

2.在這里分了兩種情況進行處理:Category 中的實例方法和屬性被整合到主類中藕各;而類方法則被整合到元類中(關(guān)于對象池摧、類和元類的更多細節(jié),可以參考我前面的博文《Objective-C對象模型》)激况。另外作彤,對協(xié)議的處理比較特殊,Category 中的協(xié)議被同時整合到了主類和元類中乌逐。

3.注意到宦棺,不管是哪種情況,最終都是通過調(diào)用staticvoid?remethodizeClass(Class cls)?函數(shù)來重新整理類的數(shù)據(jù)的黔帕。

四代咸、category結(jié)構(gòu)體

1.所有的OC類和對象,在runtime層都是用struct表示的成黄,category也不例外呐芥,在runtime層,category用結(jié)構(gòu)體category_t.

2.category結(jié)構(gòu)體的定義:

structcategory_t?{

constchar*name;//類的名字(name)

classref_t?cls;//類(cls)

? ? ??struct?method_list_t?*instanceMethods;?//category中所有給類添加的實例方法的列表(instanceMethods)

structmethod_list_t?*classMethods;//category中所有添加的類方法的列表(classMethods)

structprotocol_list_t?*protocols;?//category實現(xiàn)的所有協(xié)議的列表(protocols)

structproperty_list_t?*instanceProperties;//category中添加的所有屬性(instanceProperties)

};

3.從category的定義也可以看出category可以添加實例方法奋岁,類方法思瘟;可以遵守協(xié)議,添加屬性闻伶;但無法添加實例變量滨攻。

注意,在category中可以有屬性(property)蓝翰,但是該屬性只是生成了getter和setter方法的聲明光绕,并沒有產(chǎn)生對應(yīng)的實現(xiàn),更不會添加對應(yīng)的實例變量畜份。如果想為實例對象添加實例變量诞帐,可以嘗試使用關(guān)聯(lián)引用技術(shù)。

五爆雹、添加方法列表

原理圖:

1.添加方法列表的時候是后添加的在新形成的列表前部停蕉,這也是為什么在有多個category中有同名方法時愕鼓,后編譯的在調(diào)用時會“覆蓋”前面已編譯的方法。其實方法本身并沒有被覆蓋慧起,只是調(diào)用的時候是從上而下查找方法列表菇晃,當(dāng)運行時找到對應(yīng)的方法名后就去忙著調(diào)用了,并不會管后面的同名方法蚓挤。

2.關(guān)于load方法:

? 其實在上面的源碼中也可以看到,category 中對load方法的處理過并沒有什么特殊磺送。因此,可以說category 中的 load 方法跟普通方法一樣也會對主類中的 load方法造成覆蓋屈尼,只不過 runtime在自動調(diào)用主類和 category中的 load方法時是直接使用各自方法的指針進行調(diào)用的册着。所以我們感覺不到category對主類的影響。其實手動給主類發(fā)送load 消息時脾歧,調(diào)用的將會是分類中的load 方法甲捏。

六、注意項

1.Category 有一個非常容易誤用的場景鞭执,那就是用 Category 來覆寫父類或主類的方法司顿。雖然目前 Objective-C 是允許這么做的,但是這種使用場景是非常不推薦的兄纺。

2.使用?Category 來覆寫方法有很多缺點大溜,比如不能覆寫 Category 中的方法、無法調(diào)用主類中的原始實現(xiàn)等估脆,且很容易造成無法預(yù)估的行為钦奋。

謝謝!!!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市疙赠,隨后出現(xiàn)的幾起案子付材,更是在濱河造成了極大的恐慌,老刑警劉巖圃阳,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件厌衔,死亡現(xiàn)場離奇詭異,居然都是意外死亡捍岳,警方通過查閱死者的電腦和手機富寿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锣夹,“玉大人页徐,你說我怎么就攤上這事≡纬牵” “怎么了泞坦?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長砖顷。 經(jīng)常有香客問我贰锁,道長,這世上最難降的妖魔是什么滤蝠? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任豌熄,我火速辦了婚禮,結(jié)果婚禮上物咳,老公的妹妹穿的比我還像新娘锣险。我一直安慰自己,他們只是感情好览闰,可當(dāng)我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布芯肤。 她就那樣靜靜地躺著,像睡著了一般压鉴。 火紅的嫁衣襯著肌膚如雪崖咨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天油吭,我揣著相機與錄音击蹲,去河邊找鬼。 笑死婉宰,一個胖子當(dāng)著我的面吹牛歌豺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播心包,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼类咧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蟹腾?” 一聲冷哼從身側(cè)響起痕惋,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎岭佳,沒想到半個月后血巍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡珊随,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年述寡,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叶洞。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡鲫凶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出衩辟,到底是詐尸還是另有隱情螟炫,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布艺晴,位于F島的核電站昼钻,受9級特大地震影響掸屡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜然评,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一仅财、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧碗淌,春花似錦盏求、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至纳像,卻和暖如春荆烈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背爹耗。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工耙考, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人潭兽。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓倦始,卻偏偏與公主長得像,于是被迫代替她去往敵國和親山卦。 傳聞我的和親對象是個殘疾皇子鞋邑,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,047評論 2 355

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

  • 本文載自: http://blog.csdn.net/a316212802/article/details/49...
    MrLuckyluke閱讀 2,475評論 1 7
  • 摘要 無論一個類設(shè)計的多么完美,在未來的需求演進中账蓉,都有可能會碰到一些無法預(yù)測的情況枚碗。那怎么擴展已有的類呢?一般而...
    癲癲的戀了閱讀 1,053評論 0 6
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉铸本,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,720評論 0 9
  • 做大禮拜以粉碎驕慢肮雨。 做供養(yǎng)以對抗吝嗇。 修學(xué)慈悲以瓦解自我箱玷。 隨喜他人成功以擊倒疑忌怨规。 請求上師教導(dǎo)而轉(zhuǎn)動琺輪。...
    快樂小屋劉麗華閱讀 268評論 0 1
  • 如果你愛的人因為你有危險锡足,你會怎么做波丰?帶她一起躲避逃跑?還是一起面對舶得?還是像他一樣果斷提出分手掰烟。每次認為脫離危險就...
    維心法師閱讀 252評論 0 0