runtime - 關(guān)聯(lián)對象objc_setAssociatedObject

有許多人不知道runtime 黑魔法到底是干啥用的,到底有什么卵用,今天我們就來講講runtime - 關(guān)聯(lián)對象objc_setAssociatedObject 的使用嫌变。

慣例美女大圖一張令境,拿去擼!不客氣!

YP59~RBX2LOZ$MOJ8$WDSX8.jpg

使用關(guān)聯(lián)馏臭,我們可以不用修改類的定義而為其對象增加存儲(chǔ)空間。這在我們無法訪問到類的源碼的時(shí)候或者是考慮到二進(jìn)制兼容性的時(shí)候是非常有用讼稚。
有四個(gè)參數(shù)
1.被關(guān)聯(lián)的對象 即源對象
2.要關(guān)聯(lián)的對象的鍵值括儒,一般設(shè)置成靜態(tài)的,用于獲取關(guān)聯(lián)對象的值(就是給你要添加的東西起個(gè)名字而已)
3.關(guān)聯(lián)的對象
4.關(guān)聯(lián)時(shí)采用的協(xié)議锐想,有assign帮寻,retain,copy等協(xié)議 點(diǎn)擊進(jìn)去選取枚舉

objc_setAssociatedObject(self, &associatedButtonkey, blcok, OBJC_ASSOCIATION_COPY_NONATOMIC);
  //通過 objc_getAssociatedObject獲取關(guān)聯(lián)對象
  objc_getAssociatedObject(self, &associatedButtonkey);
//使用函數(shù)objc_removeAssociatedObjects可以斷開所有關(guān)聯(lián)赠摇。通常情況下不建議使用這個(gè)函數(shù)固逗,因?yàn)樗麜?huì)斷開所有關(guān)聯(lián)。只有在需要把對象恢復(fù)到“原始狀態(tài)”的時(shí)候才會(huì)使用這個(gè)函數(shù)藕帜。

斷開關(guān)聯(lián)是使用objc_setAssociatedObject函數(shù)抒蚜,傳入nil值即可。
objc_setAssociatedObject(self, &associatedButtonkey, nil, OBJC_ASSOCIATION_COPY_NONATOMIC);
下面我們就用這個(gè)鬼東西給UIButton綁定一個(gè)Block

先創(chuàng)建一個(gè)UIButton的category
然后聲明一個(gè)block屬性 確切的說不是屬性耘戚,其實(shí)是生成了兩個(gè)方法getter 和 setter

static const char associatedButtonkey;
typedef void (^btnBlock)(id sender);
@property (nonatomic, copy) btnBlock blcok;

聲明一個(gè)方法
+ (instancetype)WB_fatoryButtonWithFrame:(CGRect)frame
WithTitle:(NSString *)title
WithTitleColor:(UInt32)titleHexColor
Withfont:(CGFloat)font
Withimage:(id)image
WithselImage:(id)selImage
toSuperView:(UIView *)superView
WithClick:(btnBlock)block;

+ (instancetype)WB_fatoryButtonWithFrame:(CGRect)frame
                           WithTitle:(NSString *)title
                      WithTitleColor:(UInt32)titleHexColor
                             Withfont:(CGFloat)font
                            Withimage:(id)image
                        WithselImage:(id)selImage
                         toSuperView:(UIView *)superView
                           WithClick:(btnBlock)block{
UIButton *btn = [[UIButton alloc] initWithFrame:frame];
[superView addSubview:btn];

btn.titleLabel.font = [UIFont systemFontOfSize:font];
[btn setTitleColor:[UIColor colorWithRGBHex:titleHexColor alpha:1] forState:UIControlStateNormal];
if (!kIsEmptyString(title)) {
    [btn setTitle:title forState:UIControlStateNormal];
}

UIImage *normalImage = nil;
if ([image isKindOfClass:[NSString class]]) {
    normalImage = kImage(image);
} else if ([image isKindOfClass:[UIImage class]]) {
    normalImage = image;
}

UIImage *selectedImage = nil;
if ([selImage isKindOfClass:[NSString class]]) {
    selectedImage = kImage(selImage);
} else if ([selImage isKindOfClass:[UIImage class]]) {
    selectedImage = selImage;
}

if (normalImage) {
    [btn setImage:normalImage forState:UIControlStateNormal];
}

if (selectedImage) {
    [btn setImage:selectedImage forState:UIControlStateSelected];
}


if (block)
{
  //這里調(diào)用setter
    btn.blcok = block;
}

return btn;
}

  - (void)btnAction:(id)sender{
// 這里調(diào)用getter
self.blcok(sender);
  }

  // setter
- (void)setBlcok:(btnBlock)blcok{
// 給UIButton 關(guān)聯(lián)一個(gè)block
objc_setAssociatedObject(self, &associatedButtonkey, blcok, OBJC_ASSOCIATION_COPY_NONATOMIC);
[self removeTarget:self
            action:@selector(btnAction:)
  forControlEvents:UIControlEventTouchUpInside];

if (blcok) {
    [self addTarget:self
             action:@selector(btnAction:)
   forControlEvents:UIControlEventTouchUpInside];
}
}
  //getter
- (btnBlock)blcok{
// 之前說過的給起個(gè)名字嗡髓,通過那個(gè)名字獲取添加的 block
return objc_getAssociatedObject(self, &associatedButtonkey);
}

最后提醒小伙伴們不要忘記了import

import <objc/objc-runtime.h>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市收津,隨后出現(xiàn)的幾起案子饿这,更是在濱河造成了極大的恐慌浊伙,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件长捧,死亡現(xiàn)場離奇詭異嚣鄙,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)串结,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門哑子,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人肌割,你說我怎么就攤上這事卧蜓。” “怎么了把敞?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵弥奸,是天一觀的道長。 經(jīng)常有香客問我奋早,道長盛霎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任耽装,我火速辦了婚禮愤炸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘掉奄。我一直安慰自己摇幻,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布挥萌。 她就那樣靜靜地躺著绰姻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪引瀑。 梳的紋絲不亂的頭發(fā)上狂芋,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天,我揣著相機(jī)與錄音憨栽,去河邊找鬼帜矾。 笑死,一個(gè)胖子當(dāng)著我的面吹牛屑柔,可吹牛的內(nèi)容都是我干的屡萤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼掸宛,長吁一口氣:“原來是場噩夢啊……” “哼死陆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤措译,失蹤者是張志新(化名)和其女友劉穎别凤,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體领虹,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡规哪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了塌衰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诉稍。...
    茶點(diǎn)故事閱讀 39,953評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖最疆,靈堂內(nèi)的尸體忽然破棺而出杯巨,到底是詐尸還是另有隱情,我是刑警寧澤肚菠,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站罩缴,受9級特大地震影響蚊逢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜箫章,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一烙荷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧檬寂,春花似錦终抽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至镣屹,卻和暖如春圃郊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背女蜈。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工持舆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人伪窖。 一個(gè)月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓逸寓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親覆山。 傳聞我的和親對象是個(gè)殘疾皇子竹伸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評論 2 355

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

  • objc_getAssociatedObject返回與給定鍵的特定對象關(guān)聯(lián)的值。ID objc_getAssoci...
    有一種再見叫青春閱讀 1,582評論 0 7
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉簇宽,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,715評論 0 9
  • 昨天晚上做了一個(gè)夢佩伤。夢見一個(gè)高中同學(xué)成了一位職場精英聊倔,而我巧合的成了他的屬下。結(jié)局是日久生情生巡,他突然跪地向我求婚耙蔑,...
    趙小嬋閱讀 159評論 0 1
  • 讀完了第八甸陌、九章,我的心里是五味雜陳的盐股。 1.剛剛畢業(yè)的你認(rèn)為的好工作并非是一份“好工作” 已經(jīng)工作三年的我钱豁,在一...
    娃娃天晴閱讀 130評論 0 0
  • 年齡大了,心態(tài)就變化了疯汁。也知道什么是生命中重要的事了牲尺。生命的取舍也更容易接受了。 爸爸媽媽回東北了幌蚊,心里有些不舍谤碳,...
    華客魯俊閱讀 194評論 0 0