OC中關(guān)聯(lián)對象的使用之給分類“添加成員變量”

iOS開發(fā)中利用runtime為某個(gè)類的category增加屬性
這篇文章中給出了為分類“添加成員變量”的代碼耳奕,實(shí)際用到的就是關(guān)聯(lián)對象,方法是runtime中的API闸婴,至于“添加成員變量”為什么是帶引號(hào)的芍躏,下面我們進(jìn)行解釋。
看代碼:

  @interface Person (property)

  @property (nonatomic, copy) NSString *  name;

  @end

現(xiàn)在有一個(gè)Person類以及它的一個(gè)分類庇楞,在分類中我們增加一個(gè)name屬性否纬。
我們知道如果name這個(gè)屬性直接添加在Person類中,name會(huì)自動(dòng)為Person類添加一個(gè)_name成員變量和其對應(yīng)的set睛驳、get方法的聲明和實(shí)現(xiàn)膜廊,但在分類中 @property (nonatomic, copy) NSString * name;這行代碼實(shí)際上

只生成了set、get方法的聲明蹬跃,既沒有set钥勋、get方法的實(shí)現(xiàn)也沒有成員變量_name的添加。分類中是不能直接添加成員變量的。(不能添加屬性的原因)

為了在分類中達(dá)到添加成員的目的驻啤,我們需要自己去實(shí)現(xiàn)set、get方法赊瞬,看代碼:

  - (void)setName:(NSString *)name{
objc_setAssociatedObject(self, @selector(name), name, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

- (NSString *)name{
return objc_getAssociatedObject(self, _cmd);
}

set方法中我們是使用了runtime中的API設(shè)置關(guān)聯(lián)對象,get方法中我們是使用了runtime中的API獲取關(guān)聯(lián)對象薯蝎。

解釋“添加成員變量”帶引號(hào)

使用關(guān)聯(lián)對象這種方式雖然在外部看似乎就是添加了成員變量谤绳,但關(guān)聯(lián)對象并沒有被添加到被關(guān)聯(lián)的對象中即在Person類對象中的成員變量中并沒有name這個(gè)成員變量。

關(guān)聯(lián)對象存儲(chǔ)在哪里呢消略?

0.關(guān)聯(lián)對象的原理.png

看圖瞎抛,關(guān)聯(lián)對象存儲(chǔ)在全局統(tǒng)一的一個(gè)AssociationManager中。

設(shè)置關(guān)聯(lián)對象方法中的object參數(shù)做為鍵對應(yīng)一個(gè)map胎撤,在map中key參數(shù)做為鍵對應(yīng)一個(gè)ObjectAssociation断凶,在ObjectAssociation中存放著value參數(shù)和policy參數(shù)。


0.關(guān)聯(lián)對象的本質(zhì).png

OBJC_ASSOCIATION_COPY_NONATOMIC參數(shù)

解釋一下設(shè)置關(guān)聯(lián)對象中的OBJC_ASSOCIATION_COPY_NONATOMIC這個(gè)參數(shù)飘弧,這個(gè)參數(shù)是和添加的屬性的修飾符號(hào)相對應(yīng)的次伶』拢看圖:


0.objc_AssociationPolicy.png

分類不能直接添加屬性,蘋果為什么要這樣設(shè)計(jì)柱彻?

如果基類動(dòng)態(tài)增加成員變量會(huì)導(dǎo)致所有已創(chuàng)建出的子類實(shí)例都無法使用餐胀。
方法定義是在objc_class中管理的,不管如何增刪類方法卖擅,都不影響類實(shí)例的內(nèi)存布局。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末挎狸,一起剝皮案震驚了整個(gè)濱河市锨匆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌恐锣,老刑警劉巖账千,帶你破解...
    沈念sama閱讀 221,331評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匀奏,死亡現(xiàn)場離奇詭異,居然都是意外死亡论衍,警方通過查閱死者的電腦和手機(jī)聚磺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,372評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜒蕾,“玉大人焕阿,你說我怎么就攤上這事〕访” “怎么了褒纲?”我有些...
    開封第一講書人閱讀 167,755評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長衫嵌。 經(jīng)常有香客問我彻秆,道長论悴,這世上最難降的妖魔是什么墓律? 我笑而不...
    開封第一講書人閱讀 59,528評(píng)論 1 296
  • 正文 為了忘掉前任耻讽,我火速辦了婚禮帕棉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘香伴。我一直安慰自己,他們只是感情好具帮,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,526評(píng)論 6 397
  • 文/花漫 我一把揭開白布蜂厅。 她就那樣靜靜地躺著,像睡著了一般掘猿。 火紅的嫁衣襯著肌膚如雪唇跨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,166評(píng)論 1 308
  • 那天改橘,我揣著相機(jī)與錄音政勃,去河邊找鬼。 笑死既棺,一個(gè)胖子當(dāng)著我的面吹牛懒叛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播薛窥,決...
    沈念sama閱讀 40,768評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼眼姐,長吁一口氣:“原來是場噩夢啊……” “哼众旗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起贡歧,我...
    開封第一講書人閱讀 39,664評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤利朵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后绍弟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,205評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡樟遣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,290評(píng)論 3 340
  • 正文 我和宋清朗相戀三年年碘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了展鸡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,435評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡涤久,死狀恐怖忍弛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情细疚,我是刑警寧澤,帶...
    沈念sama閱讀 36,126評(píng)論 5 349
  • 正文 年R本政府宣布然遏,位于F島的核電站吧彪,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏姨裸。R本人自食惡果不足惜怨酝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,804評(píng)論 3 333
  • 文/蒙蒙 一农猬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盛险,春花似錦勋又、人聲如沸换帜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,276評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽祟牲。三九已至,卻和暖如春说贝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背言询。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來泰國打工傲宜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人函卒。 一個(gè)月前我還...
    沈念sama閱讀 48,818評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像虱咧,于是被迫代替她去往敵國和親沪蓬。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,442評(píng)論 2 359

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