Category(類別)- 擴(kuò)展類的方法

前言

關(guān)于類別,網(wǎng)上有大量優(yōu)秀的資料可以學(xué)習(xí)爸黄。但苦于自己這豆腐做的腦袋滞伟,每次研究完之后,過一陣子就忘記了炕贵。所以梆奈,這次打算一邊學(xué)習(xí),一邊整理成筆記称开,供自己后面溫習(xí)亩钟。(我這寫作的目的雖然自私,但也同樣愿意將學(xué)習(xí)筆記分享給大家鳖轰,也希望朋友們能夠多提意見清酥,大家共同進(jìn)步,雖然我是一個(gè)小菜鳥蕴侣,但我也有成為大神的理想)

這次寫作的動機(jī)還有一個(gè)焰轻,就是我剛學(xué)習(xí)了利用關(guān)聯(lián)給現(xiàn)有類擴(kuò)展屬性,并做了筆記(大部分筆記是借鑒前輩的昆雀,我覺得前輩寫的特別好辱志,在此,向這些大神前輩致謝)狞膘。類別和關(guān)聯(lián)就像兩兄弟揩懒,記錄了一個(gè)怎么都感覺不舒服(小小的強(qiáng)迫癥,還是可以接受的)挽封。


我們先來說說為什么會有類別這個(gè)東西

1已球,為系統(tǒng)框架擴(kuò)展方法,針對實(shí)際的運(yùn)用場景场仲,豐富系統(tǒng)框架的功能和悦。同時(shí)又不會破話系統(tǒng)框架的完整性。實(shí)際的運(yùn)用場景很多渠缕,我在這里不一一列舉鸽素,我們首先理解這個(gè)東西,然后再談使用亦鳞。系統(tǒng)框架沒有源碼馍忽,你就是想在類中增加方法也不可能(這不廢話嗎)棒坏。我們的開發(fā),無論何時(shí)都離不開系統(tǒng)提供的基礎(chǔ)框架遭笋,那么坝冕,基于系統(tǒng)框架擴(kuò)展的方法,就會擁有超強(qiáng)的生存能力瓦呼,也就是可以最大程度的復(fù)用代碼喂窟。當(dāng)遇到相同或者類似的場景時(shí),使用或者修改方法的實(shí)現(xiàn)即可央串。

2磨澡,從第一點(diǎn)就可以看出,我們在給系統(tǒng)或者自定義類擴(kuò)展方法時(shí)质和,并不受文件或者框架的限制稳摄,也就是說,我們可以靈活的在工程框架的任意位置為當(dāng)前的業(yè)務(wù)處理擴(kuò)展方法饲宿,這樣我們的擴(kuò)展可以無限接近我們的業(yè)務(wù)層厦酬,不僅方便代碼理解和維護(hù),同時(shí)也可以讓我們更加優(yōu)雅的寫代碼瘫想,不至于寫著寫著就要跳到工程的別的地方去了仗阅。

基于1,2兩點(diǎn)国夜,我們可以對類別這個(gè)東西下一個(gè)基本的定義:

為工程中存在的類擴(kuò)展方法

什么霹菊?就這么簡單。是的支竹,其實(shí)這就是類別最重要也是最基本的功能:擴(kuò)展方法旋廷;

個(gè)人理解:結(jié)合基本定義,同時(shí)在實(shí)際場景中合理利用類別礼搁,可以讓你的代碼變得優(yōu)雅自如饶碘。


有好就有壞,沒有陰陽調(diào)和馒吴,這家伙還不寂寞死扎运。

局限性

1,只能添加方法饮戳,不能添加屬性豪治。

這都是廢話了,為什么只能擴(kuò)展方法呢扯罐?屬性什么不能被直接擴(kuò)展呢负拟。

目前以我查到的資料顯示:類別是在程序運(yùn)行期將擴(kuò)展的方法加入到類的方法列表中(methodLists),但此時(shí)歹河,程序已經(jīng)編譯完成掩浙,類的內(nèi)存結(jié)構(gòu)已經(jīng)確定(類的內(nèi)存結(jié)構(gòu)是由類的屬性列表ivarsLIsts決定的)花吟,此時(shí)如果往屬性列表中添加屬性,會破話類的內(nèi)存結(jié)構(gòu)厨姚,這對編譯型語言來說是災(zāi)難性的衅澈。所以此時(shí)不可以改變其內(nèi)存結(jié)構(gòu),也就沒有辦法為該類添加屬性谬墙。

那么Runtime如何可以動態(tài)添加屬性呢今布?它添加屬性放入方式叫做關(guān)聯(lián)。說白了拭抬,它并沒有真正的將屬性添加到類的屬性列表中险耀,只是在內(nèi)存索引數(shù)組中,找到未使用的內(nèi)存空間玖喘,創(chuàng)建關(guān)聯(lián)對象,然后利用關(guān)鍵詞標(biāo)記該關(guān)聯(lián)對象的內(nèi)存指針蘑志,這樣累奈,當(dāng)通過類來使用該關(guān)聯(lián)對象時(shí),就可以通過關(guān)鍵詞來獲取該關(guān)聯(lián)對象急但,并使用該內(nèi)存澎媒。


isa的相關(guān)知識

深入理解Objective-C:Category

Associated Objects

http://blog.ibireme.com/2016/01/16/spinlock_is_unsafe_in_ios/


extension看起來很像一個(gè)匿名的category,但是extension和有名字的category幾乎完全是兩個(gè)東西波桩。 extension在編譯期決議戒努,它就是類的一部分,在編譯期和頭文件里的@interface以及實(shí)現(xiàn)文件里的@implement一起形成一個(gè)完整的類镐躲,它伴隨類的產(chǎn)生而產(chǎn)生储玫,亦隨之一起消亡。extension一般用來隱藏類的私有信息萤皂,你必須有一個(gè)類的源碼才能為一個(gè)類添加extension撒穷,所以你無法為系統(tǒng)的類比如NSString添加extension。

但是category則完全不一樣裆熙,它是在運(yùn)行期決議的端礼。

就category和extension的區(qū)別來看,我們可以推導(dǎo)出一個(gè)明顯的事實(shí)入录,extension可以添加實(shí)例變量蛤奥,而category是無法添加實(shí)例變量的(因?yàn)樵谶\(yùn)行期,對象的內(nèi)存布局已經(jīng)確定僚稿,如果添加實(shí)例變量就會破壞類的內(nèi)部布局凡桥,這對編譯型語言來說是災(zāi)難性的)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蚀同,一起剝皮案震驚了整個(gè)濱河市唬血,隨后出現(xiàn)的幾起案子望蜡,更是在濱河造成了極大的恐慌,老刑警劉巖拷恨,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脖律,死亡現(xiàn)場離奇詭異,居然都是意外死亡腕侄,警方通過查閱死者的電腦和手機(jī)小泉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來冕杠,“玉大人微姊,你說我怎么就攤上這事》衷ぃ” “怎么了兢交?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長笼痹。 經(jīng)常有香客問我配喳,道長,這世上最難降的妖魔是什么凳干? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任晴裹,我火速辦了婚禮,結(jié)果婚禮上救赐,老公的妹妹穿的比我還像新娘涧团。我一直安慰自己,他們只是感情好经磅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布泌绣。 她就那樣靜靜地躺著,像睡著了一般预厌。 火紅的嫁衣襯著肌膚如雪赞别。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天配乓,我揣著相機(jī)與錄音仿滔,去河邊找鬼。 笑死犹芹,一個(gè)胖子當(dāng)著我的面吹牛崎页,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播腰埂,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼飒焦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起牺荠,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤翁巍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后休雌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體灶壶,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年杈曲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了驰凛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,764評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡担扑,死狀恐怖恰响,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情涌献,我是刑警寧澤胚宦,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站燕垃,受9級特大地震影響枢劝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜利术,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望低矮。 院中可真熱鬧印叁,春花似錦、人聲如沸军掂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蝗锥。三九已至跃洛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間终议,已是汗流浹背汇竭。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留穴张,地道東北人细燎。 一個(gè)月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像皂甘,于是被迫代替她去往敵國和親玻驻。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評論 2 354

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