添加屬性可以再分類的.h文件中來添加七问,也可以再.m文件中的匿名分類中添加,我們像添加普通屬性一樣添加分類屬性,這是編譯器不會(huì)報(bào)任何的異常沟娱,但是當(dāng)使用到這些分類屬性的時(shí)候會(huì)導(dǎo)致程序崩潰,為了解決這個(gè)問題腕柜,我們需要用到runtime運(yùn)行時(shí)济似。
舉個(gè)栗子:
//添加運(yùn)行時(shí)頭文件
#import <objc/runtime.h>
//添加的分類屬性
@property (nonatomic, copy) NSString *title;
//重寫屬性的set和get方法
// 定義屬性的Key
static NSString *titleKey = @"titleKey";
- (void)setTitle:(NSString *)title
{
objc_setAssociatedObject(self, &titleKey, title, OBJC_ASSOCIATION_COPY); //此處把title參數(shù)值跟titleKey關(guān)聯(lián)起來
}
- (NSString *)title
{
return objc_getAssociatedObject(self, &titleKey); //此處通過titileKey將前面關(guān)聯(lián)好的參數(shù)值取出來
}
objc_setAssociatedObject方法中,有四個(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)變量地址唯一不變的特性(解釋見:關(guān)于static)
(1)static void *strKey = &strKey;
(2)@selector(methodName)
(3)_cmd
關(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ì)象使用原子性
};
給分類添加一個(gè)布爾類型屬性的步驟
1. 需要在.m中包含頭文件
#import <objc/runtime.h>;
2. 在.h中添加BOOL屬性
@property (nonatomic, assign) BOOL open;
3. 在.m中實(shí)現(xiàn)其getter和setter方法:
- (BOOL)open {
NSNumber *value = objc_getAssociatedObject(self, @Selector(open));
return value.boolValue;
}
- (void)setOpen:(BOOL)open {
objc_setAssociatedObject(self, @Selector(open), @(open), OBJC_ASSOCIATION_ASSIGN);
}
C語言中void * 為 “不確定類型指針”,void *可以用來聲明指針