給類別加屬性runtime

遇到一個(gè)問題,寫了一個(gè)分類,但原先類的屬性不夠用。添加一個(gè)屬性,調(diào)用的時(shí)候崩潰了,說是找不到getter、setter方法。查了下文檔發(fā)現(xiàn),OC的分類允許給分類添加屬性,但不會(huì)自動(dòng)生成getter、setter方法。有沒有解決方案呢?有,通過運(yùn)行時(shí)建立關(guān)聯(lián)引用。接下來以添加一個(gè)這樣的屬性為例:

@property (nonatomic, copy) NSString *str;

1.引用運(yùn)行時(shí)頭文件。

#import <objc/runtime.h>

2.在匿名分類或者頭文件中添加屬性。區(qū)別是:匿名分類中添加的是私有屬性,只在本類中可以使用,類的實(shí)例中不可以使用。頭文件中添加的在類的實(shí)例中也可以使用。

//分類的頭文件

@interface ClassName (CategoryName)

//我要添加一個(gè)實(shí)例也可以訪問的變量所以就寫在這里了

@property (nonatomic, strong) NSString *str;

@end

//匿名分類

@interface ClassName ()

@end

3、在實(shí)現(xiàn)里面寫要添加屬性的getter、setter方法。

@implementation ClassName (CategoryName)

-(void)setStr:(NSString *)str

{

objc_setAssociatedObject(self, &strKey, str, OBJC_ASSOCIATION_COPY);

}

-(NSString *)str

{

return objc_getAssociatedObject(self, &strKey);

}

@end

在setStr:方法中使用了一個(gè)objc_setAssociatedObject的方法,這個(gè)方法有四個(gè)參數(shù),分別是:源對(duì)象,關(guān)聯(lián)時(shí)的用來標(biāo)記是哪一個(gè)屬性的key(因?yàn)槟憧赡芤砑雍芏鄬傩裕?,關(guān)聯(lián)的對(duì)象和一個(gè)關(guān)聯(lián)策略。

用來標(biāo)記是哪一個(gè)屬性的key常見有三種寫法,但代碼效果是一樣的,如下:

//利用靜態(tài)變量地址唯一不變的特性

1、static void *strKey = &strKey;

2、static NSString *strKey = @"strKey";

3、static char strKey;

關(guān)聯(lián)策略是個(gè)枚舉值,解釋如下:

enum {

OBJC_ASSOCIATION_ASSIGN = 0, //關(guān)聯(lián)對(duì)象的屬性是弱引用

OBJC_ASSOCIATION_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_ASSOCIATION_COPY = 01403 //關(guān)聯(lián)對(duì)象的屬性是copy并且關(guān)聯(lián)對(duì)象使用原子性

};

4、完成后的整體代碼如下:

.h文件

//分類的頭文件

@interface ClassName (CategoryName)

@property (nonatomic, strong) NSString *str;

@end

.m文件

//實(shí)現(xiàn)文件

#import "ClassName + CategoryName.h"#importstatic void *strKey = &strKey;

@implementation ClassName (CategoryName)

-(void)setStr:(NSString *)str

{

objc_setAssociatedObject(self, & strKey, str, OBJC_ASSOCIATION_COPY);

}

-(NSString *)str

{

return objc_getAssociatedObject(self, &strKey);

}

@end

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 2,042評(píng)論 0 9
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 30,224評(píng)論 8 265
  • 關(guān)聯(lián) 關(guān)聯(lián)是指把兩個(gè)對(duì)象相互關(guān)聯(lián)起來,使得其中的一個(gè)對(duì)象作為另外一個(gè)對(duì)象的一部分。 關(guān)聯(lián)特性只有在Mac OS ...
    玩簡(jiǎn)書閱讀 1,103評(píng)論 0 1
  • 俗話說,福禍所依,一切都是最好的安排! 在日常生活中,你擅長(zhǎng)說不,害怕拒絕別人嗎?我不擅長(zhǎng),也害怕拒絕別人;你擅長(zhǎng)...
    linda2021閱讀 340評(píng)論 0 0
  • 每個(gè)人大概都會(huì)經(jīng)歷這樣一個(gè)階段:迷茫。 我, 一個(gè)待畢業(yè)的本碩雙非的研究生一枚,面臨就業(yè)與讀博的...
    土豆粉大雞腿閱讀 232評(píng)論 0 2

友情鏈接更多精彩內(nèi)容