為什么分類不能添加屬性
Category
Category 是表示一個(gè)指向分類的結(jié)構(gòu)體的指針聚霜,其定義如下:
typedef struct objc_category *Category;
struct objc_category {
char *category_name OBJC2_UNAVAILABLE; // 分類名
char *class_name OBJC2_UNAVAILABLE; // 分類所屬的類名
struct objc_method_list *instance_methods OBJC2_UNAVAILABLE; // 實(shí)例方法列表
struct objc_method_list *class_methods OBJC2_UNAVAILABLE; // 類方法列表
struct objc_protocol_list *protocols OBJC2_UNAVAILABLE; // 分類所實(shí)現(xiàn)的協(xié)議列表
}
結(jié)構(gòu)體沒有屬性列表:
這也就是為什么分類不能添加屬性的本質(zhì)原因。
屬性是什么
屬性 = 成員變量 + set方法 + get方法。
@interface DKObject : NSObject
@property (nonatomic, strong) NSString *property;
@end
@implementation DKObject {
NSString *_property;
}
- (NSString *)property {
return _property;
}
- (void)setProperty:(NSString *)property {
_property = property;
}
@end
- 生成實(shí)例變量 _property
- 生成 getter 方法 - property
- 生成 setter 方法 - setProperty:
當(dāng)我們聲明一個(gè)屬性str的時(shí)候巡雨,在編譯階段,編譯器會(huì)自動(dòng)給對(duì)象添加一個(gè)實(shí)例變量_str和它的存取方法- (void)setStr:(NSString *)str和- (NSString *)str。這個(gè)過(guò)程由于是在編譯階段自動(dòng)合成的,所以我們?cè)诰庉嬰A段是看不到的浸策。
怎么添加屬性
由于OC是動(dòng)態(tài)語(yǔ)言,可以通過(guò)runtime手動(dòng)添加setter/getter方法。
#import <objc/runtime.h>
static NSString *nameWithSetterGetterKey = @"nameWithSetterGetterKey"; //定義一個(gè)key值
@implementation Programmer (Category)
//運(yùn)行時(shí)實(shí)現(xiàn)setter方法
- (void)setNameWithSetterGetter:(NSString *)nameWithSetterGetter {
objc_setAssociatedObject(self, &nameWithSetterGetterKey, nameWithSetterGetter, OBJC_ASSOCIATION_COPY);
}
//運(yùn)行時(shí)實(shí)現(xiàn)getter方法
- (NSString *)nameWithSetterGetter {
return objc_getAssociatedObject(self, &nameWithSetterGetterKey);
}
@end
關(guān)聯(lián)對(duì)象associatedObject理解
- objc_setAssociatedObject
void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy);
以鍵值對(duì)形式添加關(guān)聯(lián)對(duì)象:
參數(shù)|含義|
-|-|-|
id|關(guān)聯(lián)對(duì)象|
key|鍵值對(duì)key(必須要唯一惹盼,所以用static修飾)|
value|鍵值對(duì)vaule|
policy|修飾屬性
- objc_getAssociatedObject
id objc_getAssociatedObject(id object, const void *key);
根據(jù) key 獲取關(guān)聯(lián)對(duì)象
引用