Category 添加屬性 Runtime

category 是一個平常開發(fā)經(jīng)常會用到的一個技術(shù)點芋肠,不過大多數(shù)情況下,也只是對某一個類添加一些實例方法 或者類方法沪编。一般也足以滿足需求。

不過如果在方法中年扩,有需要傳遞變量時漾抬,僅僅靠方法就不夠了。
例如常遂,為 UIView 添加一個點擊手勢纳令,傳入一個 block。 就需要 UIView 持有一個 block克胳。
在Objective-C提供的runtime函數(shù)中平绩,確實有一個class_addIvar()函數(shù)用于給類添加成員變量,但是這個函數(shù)只能在“構(gòu)建一個類的過程中”調(diào)用漠另。一旦完成類定義捏雌,就不能再添加成員變量了。
那么在 category 的 .h 添加了 @property 的時候笆搓,只會生成對應(yīng)的 getter 和 setter 方法性湿,并不會有實例變量的產(chǎn)生。因為類分配的內(nèi)存區(qū)域在編譯時就確定了满败。

為什么可以在類別中添加方法和屬性呢肤频?
因為方法和屬性并不“屬于”類實例,而成員變量“屬于”類實例算墨。
方法定義是在objc_class中管理的宵荒,不管如何增刪類方法,都不影響類實例的內(nèi)存布局净嘀,已經(jīng)創(chuàng)建出的類實例仍然可正常使用报咳。

如果需要在 category 中添加實例變量怎么處理呢?
這時候就需要使用到黑魔法 Runtime 挖藏,因為 OC 的是一門動態(tài)語言暑刃,有運行時的特性。所以可以利用 Runtime 的關(guān)聯(lián)方法膜眠,讓兩個對象關(guān)聯(lián)起來岩臣。
代碼如下袁翁,

//  UIView+TapBlock.h

#import <UIKit/UIKit.h>

@interface UIView (TapBlock)

typedef void (^TapActionBlock)(void);

- (void)bs_whenTapped:(TapActionBlock)block;

@end
//  UIView+TapBlock.m

#import "UIView+TapBlock.h"
#import <objc/runtime.h>
@interface UIView (TapBlockInternal)

@property (nonatomic, copy) TapActionBlock tapBlock;

@end

@implementation UIView (TapBlock)

- (void)bs_whenTapped:(TapActionBlock)block {
    self.tapBlock = block;
    self.userInteractionEnabled = YES;
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction)];
    [self addGestureRecognizer:tap];
}

- (void)tapAction {
    if (self.tapBlock) {
        self.tapBlock();
    }
}

static const char BSTapActionBlockKey = '\0';
- (TapActionBlock)tapBlock {
    return objc_getAssociatedObject(self, &BSTapActionBlockKey);
}

- (void)setTapBlock:(TapActionBlock)tapBlock {
    /*
     objc_AssociationPolicy參數(shù)使用的策略:
     OBJC_ASSOCIATION_ASSIGN;            //assign策略
     OBJC_ASSOCIATION_COPY_NONATOMIC;    //copy策略
     OBJC_ASSOCIATION_RETAIN_NONATOMIC;  // retain策略
     
     OBJC_ASSOCIATION_RETAIN;
     OBJC_ASSOCIATION_COPY;
     */
    /*
     關(guān)聯(lián)方法:
     objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy);
     
     參數(shù):
     * id object 給哪個對象的屬性賦值
     const void *key 屬性對應(yīng)的key
     id value  設(shè)置屬性值為value
     objc_AssociationPolicy policy  使用的策略,是一個枚舉值婿脸,和copy粱胜,retain,assign是一樣的狐树,手機開發(fā)一般都選擇NONATOMIC
     */
    
    objc_setAssociatedObject(self, &BSTapActionBlockKey, tapBlock, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

@end

文中借鑒的資料鏈接:
https://blog.csdn.net/mumuyinyin/article/details/72854579
https://github.com/CoderMJLee/MJRefresh
https://github.com/BlocksKit/BlocksKit

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末焙压,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子抑钟,更是在濱河造成了極大的恐慌涯曲,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件在塔,死亡現(xiàn)場離奇詭異幻件,居然都是意外死亡,警方通過查閱死者的電腦和手機蛔溃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門绰沥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人贺待,你說我怎么就攤上這事徽曲。” “怎么了麸塞?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵秃臣,是天一觀的道長。 經(jīng)常有香客問我哪工,道長奥此,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任雁比,我火速辦了婚禮稚虎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘章贞。我一直安慰自己祥绞,他們只是感情好非洲,可當(dāng)我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布鸭限。 她就那樣靜靜地躺著,像睡著了一般两踏。 火紅的嫁衣襯著肌膚如雪败京。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天梦染,我揣著相機與錄音赡麦,去河邊找鬼朴皆。 笑死,一個胖子當(dāng)著我的面吹牛泛粹,可吹牛的內(nèi)容都是我干的遂铡。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼晶姊,長吁一口氣:“原來是場噩夢啊……” “哼扒接!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起们衙,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤钾怔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蒙挑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宗侦,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年忆蚀,在試婚紗的時候發(fā)現(xiàn)自己被綠了矾利。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡馋袜,死狀恐怖梦皮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情桃焕,我是刑警寧澤剑肯,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站观堂,受9級特大地震影響让网,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜师痕,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一溃睹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧胰坟,春花似錦因篇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至吹缔,卻和暖如春商佑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背厢塘。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工茶没, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留肌幽,地道東北人。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓抓半,卻偏偏與公主長得像喂急,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子笛求,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,527評論 2 349

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

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,092評論 1 32
  • 1煮岁、通過CocoaPods安裝項目名稱項目信息 AFNetworking網(wǎng)絡(luò)請求組件 FMDB本地數(shù)據(jù)庫組件 SD...
    陽明先生_X自主閱讀 15,969評論 3 119
  • 昨天是個灰暗的日子,我經(jīng)歷了工作以來最大的挫折涣易。面對電話那頭的家長情緒的怒吼画机,我在掛斷電話后依然不能平復(fù),眼淚在眼...
    靜靜老師閱讀 228評論 0 2
  • 目標(biāo):百分之九十以上的分數(shù) 形同虛設(shè) 不如不寫 中心詞:日常 你所期待的是什么呢 你所局限的也不知道吧 你還在思考...
    良辰美LiangChen閱讀 219評論 0 0