關(guān)聯(lián)對象方式探秘

對于category分類而言赂苗,一般我們不給分類添加屬性蝎亚,只給它添加方法蚕甥。這是因為給分類添加完屬性之后舌镶,在其他類中不能正常地使用點語法來給這個分類里面的屬性賦值和取值糊啡,所以添加了也沒有什么意義拄查。本篇文章就要介紹如何使用Runtime運行時機制中的關(guān)聯(lián)對象方式來給分類添加屬性,使之能夠在其他類中正常地使用點語法來賦值和取值棚蓄。

在探究關(guān)聯(lián)對象的方式之前堕扶,我們需要明確一點:

可以給分類添加屬性,但是不能添加成員變量梭依。給分類添加成員變量的話稍算,程序在編譯的時候會報錯:

給分類添加成員變量

然后還要明確的是在普通類中添加一個屬性,系統(tǒng)在編譯的時候會自動為我們做三件事:

  1. 會在.h文件中生成一個帶下橫線的成員變量役拴;
  2. 會在.h文件中生成這個屬性的set和get方法的聲明糊探;
  3. 會在.m文件中生成這個屬性的set和get方法的實現(xiàn)。

但是給分類添加一個屬性,系統(tǒng)在編譯的時候只會為我們做一件事:

會在.h文件中生成這個屬性的set和get方法的聲明科平。

因為系統(tǒng)不能自動生成新添加屬性的set和get方法的實現(xiàn)褥紫,所以想要在其他類中能夠使用這個屬性的點語法來給這個屬性賦值和取值的話就要用Runtime運行時機制的關(guān)聯(lián)對象的方式在這個分類的.m文件中實現(xiàn)set和get方法。

使用關(guān)聯(lián)對象方式的步驟:

1. 在分類的.h文件中添加新的屬性:

#import "ZPPerson.h"

NS_ASSUME_NONNULL_BEGIN

@interface ZPPerson (ZPTest)

@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) int weight;

@end

NS_ASSUME_NONNULL_END

2. 在分類的.m文件中撰寫這個屬性的set和get方法:

#import "ZPPerson+ZPTest.h"
#import <objc/runtime.h>

@implementation ZPPerson (ZPTest)

//是一個指針瞪慧,里面可以存儲地址值髓考。
static const void *nameKey = &nameKey;
static const void *weightKey = &weightKey;

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

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

- (void)setWeight:(int)weight
{
    objc_setAssociatedObject(self, weightKey, [NSNumber numberWithInt:weight], OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (int)weight
{
    return [objc_getAssociatedObject(self, weightKey) intValue];
}

@end

然后在其他類中就可以使用點語法來訪問這個分類里面的屬性了。所以關(guān)聯(lián)對象的方式是Runtime運行時機制的又一重大應(yīng)用汞贸。

應(yīng)當注意的是绳军,當使用關(guān)聯(lián)對象的方式給分類添加屬性之后,在程序編譯結(jié)束的時候矢腻,會產(chǎn)生這個屬性的set门驾、get方法的聲明以及set、get方法的實現(xiàn)多柑,并且會把這些東西存放在 struct _category_t 結(jié)構(gòu)體(分類的底層實現(xiàn))中奶是,但還是不會產(chǎn)生帶下橫線的成員變量。

Github Demo

”三人行竣灌,必有我?guī)熝伞埃?歡迎各位批評指正聂沙。
如果您還覺得我寫的不錯的話請您點贊加關(guān)注,您的肯定是我前進的最大動力初嘹!
我是愛學(xué)習(xí)也愛您的樹懶O(∩_∩)O

最后編輯于
?著作權(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é)果婚禮上,老公的妹妹穿的比我還像新娘褐桌。我一直安慰自己衰抑,他們只是感情好,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布荧嵌。 她就那樣靜靜地躺著呛踊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪啦撮。 梳的紋絲不亂的頭發(fā)上谭网,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天,我揣著相機與錄音赃春,去河邊找鬼愉择。 笑死,一個胖子當著我的面吹牛织中,可吹牛的內(nèi)容都是我干的锥涕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼狭吼,長吁一口氣:“原來是場噩夢啊……” “哼层坠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起刁笙,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤破花,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后采盒,有當?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
  • 正文 我出身青樓姨丈,卻偏偏與公主長得像畅卓,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蟋恬,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359