類別添加屬性,雖然知道,但是用的比較少,經(jīng)常忘記,這里記錄一下.[看原作者][1]
[1]:http://www.reibang.com/p/3cbab68fb856
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)槟憧赡芤砑雍芏鄬傩裕P(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"
#import <objc/runtime.h>
static 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