- 原理:給一個(gè)類聲明屬性爆捞,其實(shí)本質(zhì)就是給這個(gè)類添加關(guān)聯(lián)鲤脏,并不是直接把這個(gè)值的內(nèi)存空間添加到類存空間芬骄。
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 給系統(tǒng)NSObject類動(dòng)態(tài)添加屬性name
NSObject *objc = [[NSObject alloc] init];
objc.name = @"fzq";
NSLog(@"%@",objc.name);
}
@end
@interface NSObject (Property)
// @property作用:在分類中不會(huì)生成下劃線成員屬性,只會(huì)生成get,set方法聲明
@property NSString *name;
@end
// 定義關(guān)聯(lián)的key
static char * const key = "name";
@implementation NSObject (Property)
- (NSString *)name
{
// 根據(jù)關(guān)聯(lián)的key寒矿,獲取關(guān)聯(lián)的值蟆淀。
return objc_getAssociatedObject(self, key);
}
- (void)setName:(NSString *)name
{
// 第一個(gè)參數(shù):給哪個(gè)對象添加關(guān)聯(lián)
// 第二個(gè)參數(shù):關(guān)聯(lián)的key太援,通過這個(gè)key獲取
// 第三個(gè)參數(shù):關(guān)聯(lián)的value
// 第四個(gè)參數(shù):關(guān)聯(lián)的策略
objc_setAssociatedObject(self, key, name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end