溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

RunTime的使用-Category中增加實(shí)例變量

發(fā)布時(shí)間:2020-06-11 15:54:21 來源:網(wǎng)絡(luò) 閱讀:436 作者:卓行天下 欄目:開發(fā)技術(shù)

RunTime的使用-Category中增加實(shí)例變量

很久沒遇到問題了,今天寫類目的時(shí)候發(fā)現(xiàn),在我們所創(chuàng)建的類目(Category)中 只能寫方法不能寫實(shí)例變量以及屬性,但是這無疑非常不方便,于是這里用到RunTime 這樣就能在類目中對(duì)屬性進(jìn)行賦值了。
下面我們介紹一個(gè)很巧妙的方法來解決:使用runtime庫的
 objc_setAssociatedObject / objc_getAssociatedObject 函數(shù)來解決。
這里只用到RunTime的2個(gè)方法,還有其他的方法
。
通過這相中方法,明眼人可以看到有set 與 get 的關(guān)鍵字  也就是說一個(gè)是設(shè)置一個(gè)是取值  
,通過這種方法來模擬生成屬性。

代碼:
在.h文件中正常的聲明一個(gè)屬性,不要太浮夸
@property (nonatomic,
retain)ZbarViewController *readerVC;

然后在.M中包含RunTime的頭文件
#import <objc/runtime.h>
然后這步驟非常重要 我們需要一個(gè)關(guān)聯(lián)的時(shí)候的Key來使用
,這個(gè)Key是用來存儲(chǔ)用的
//常規(guī)用來標(biāo)注的Key 萬年不變?nèi)N寫法
1、static void *strKey = &strKey;
2static NSString *strKey = @"strKey"
3、static char strKey;
這里我用第三種
 
static char AddressKey; 


之后開始調(diào)用RunTime的方法
//設(shè)置值
- (void)setAlloc:(ZbarViewController *)zBar
{
    objc_setAssociatedObject(self, &AddressKey, zBar, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

objc_setAssociatedObject的方法,這個(gè)方法有四個(gè)參數(shù),分別是:源對(duì)象(self),關(guān)聯(lián)時(shí)的用來標(biāo)記是哪一個(gè)屬性的key(AddressKey)(因?yàn)槟憧赡芤砑雍芏鄬傩裕?,關(guān)聯(lián)的對(duì)象(zBar)和一個(gè)關(guān)聯(lián)策略(我前面聲明屬性用的是retain 所以這里用的是retain)。 
關(guān)聯(lián)策略是一個(gè)枚舉值 

enum { 
OBJC_ASSO
CIATION_ASSIGN = 0//關(guān)聯(lián)對(duì)象的屬性是弱引用 
OBJC_ASSO
CIATION_RETAIN_NONATOMIC = 1//關(guān)聯(lián)對(duì)象的屬性是強(qiáng)引用并且關(guān)聯(lián)對(duì)象不使用原子性OBJC_ASSOCIATION_COPY_NONATOMIC = 3//關(guān)聯(lián)對(duì)象的屬性是copy并且關(guān)聯(lián)對(duì)象不使用原子性
OBJC_ASSOCIATION_RETAIN = 01401//關(guān)聯(lián)對(duì)象的屬性是copy并且關(guān)聯(lián)對(duì)象使用原子性 
OBJC_ASSO
CIATION_COPY = 01403 //關(guān)聯(lián)對(duì)象的屬性是copy并且關(guān)聯(lián)對(duì)象使用原子性};
 
//取值
- (ZbarViewController *)get
{
    return objc_getAssociatedObject(self, &AddressKey);
}

然后初始化的方法  跟取值的方法分別為
 [self setAlloc:[ZbarViewController new]];   //調(diào)用set
    [self get].readerDelegate = self;    //調(diào)用Get 
這樣就能在類目中使用屬性了。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI