在日常的開發(fā)當中我們經(jīng)常使用Category來處理一些問題,但是Category有個蛋疼的事至非,不能為原類添加屬性钠署。了解過Runtime的小伙伴都知道,我們可以利用runtime來解決這個問題荒椭。但是今天我們來了解一下Category為什么不能為原類添加屬性谐鼎。
我們先來創(chuàng)建一個Book類,定義一個屬性BookName趣惠。
@interface Book : NSObject
@property (nonatomic, copy) NSString *bookName;
@end
再來創(chuàng)建一個分類狸棍,定義一個屬性。
@interface Book (Property)
@property (nonatomic, copy) NSString *author;
@end
這里大家要先了解一下屬性的構(gòu)成
Property(屬性) = ivar(實例變量) + setter + getter
接下來我們可以利用runtime來打印一下味悄。
//獲取類的成員變量
- (void)getClassIvars {
unsigned int count;
//獲取成員變量的數(shù)組的指針
Ivar *ivars = class_copyIvarList([Book class], &count);
for (int i = 0; i < count; i++) {
Ivar ivar = ivars[i];
//根據(jù)ivar獲得其成員變量的名稱
const char *name = ivar_getName(ivar);
//c的字符串轉(zhuǎn)oc的字符串
NSString *key = [NSString stringWithUTF8String:name];
NSLog(@"ivar__%d == %@",i,key);
}
//記得釋放
free(ivars);
//如果你的成員私有草戈,也可以獲取到 比如_education
}
//獲取類的成員屬性
- (void)getClassProperty {
unsigned int count;
//獲得指向該類所有屬性的指針
objc_property_t *properties = class_copyPropertyList([Book class], &count);
for (int i = 0; i < count; i++) {
//獲取該類的一個屬性的指針
objc_property_t property = properties[i];
//獲取屬性的名稱
const char *name = property_getName(property);
//將c的字符串轉(zhuǎn)化為OC字符串
NSString *key = [NSString stringWithUTF8String:name];
NSLog(@"propertyLabel__%d == %@",i,key);
}
//記得釋放
free(properties);
}
打印結(jié)果
2017-02-22 14:57:21.218 DDTool[1757:134117] ivar__0 == _bookName
2017-02-22 14:57:21.219 DDTool[1757:134117] property__0 == author
2017-02-22 14:57:21.219 DDTool[1757:134117] property__1 == bookName
2017-02-22 14:57:21.219 DDTool[1757:134117] method__0 == bookName 2
2017-02-22 14:57:21.219 DDTool[1757:134117] method__1 == setBookName: 3
2017-02-22 14:57:21.219 DDTool[1757:134117] method__2 == .cxx_destruct 2
- 這里我們可能有一個疑惑,pro_list打印的結(jié)果中不是有author這個屬性么(這個下面會說侍瑟,我們先觀察重點)唐片,我們發(fā)現(xiàn)ivar_list打印的結(jié)果中只有_bookName這個實例變量丙猬,沒有_author。這樣我們就可以大概知道為什么添加不了屬性了费韭,沒有滿足屬性的構(gòu)成條件茧球。
- 接著上面的疑問來講,其實這里打印的pro_list并非是上文所述的屬性星持,它只是一個屬性的描述抢埋。這里看到其他的博客上有講到:
每次在增加一個屬性,系統(tǒng)都會在ivar_list中添加一個成員變量的描述,在method_list中增加setter與getter方法的描述,在pro_list中增加一個屬性的描述,然后計算該屬性在對象中的偏移量,然后給出setter與getter方法對應(yīng)的實現(xiàn)。
至于Category為什么沒有生成ivar督暂,是因為分類本身并不是一個真正的類揪垄,它并沒有自己的isa。
以上是自己在查閱資料后的一些淺層理解损痰,不正確的福侈、不足的地方還有望指出。??