技术干货(5) - 在分类中设置属性

2017-01-11 16:04:59来源:http://www.jianshu.com/p/7444226c58e8作者:浮云漫步人点击

第七城市

内容源自于网络,这里只是稍作整理和适当修改


众所周知,分类中是无法设置属性的,如果在分类的声明中写@property 只能为其生成get 和 set 方法的声明,但无法生成成员变量,就是虽然点语法能调用出来,但程序执行后会crash,有人会想到使用全局变量呢?比如这样:


int _age;
- (int )age {
return _age;
}
- (void)setAge:(int)age {
_age = age;
}

但是全局变量程序整个执行过程中内存中只有一份,我们创建多个对象修改其属性值都会修改同一个变量,这样就无法保证像属性一样每个对象都拥有其自己的属性值。这时我们就需要借助runtime为分类增加属性的功能了。



需要用到的方法 <objc/runtime.h>



set方法,将值value 跟对象object 关联起来(将值value 存储到对象object 中)


参数 object:给哪个对象设置属性


参数 key:一个属性对应一个Key,将来可以通过key取出这个存储的值,key 可以是任何类型:double、int 等,建议用char 可以节省字节


参数 value:给属性设置的值


参数policy:存储策略 (assign 、copy 、 retain就是strong)


void objc_setAssociatedObject(id object , const void *key ,id value ,objc_AssociationPolicy policy)


利用参数key 将对象object中存储的对应值取出来

id objc_getAssociatedObject(id object , const void *key)



步骤:


1、创建一个分类,比如给任何一个对象都添加一个name属性,就是NSObject添加分类(NSObject+Category)
2、先在.h 中@property 声明出get 和 set 方法,方便点语法调用

@property(nonatomic,copy)NSString *name;


3、在.m 中重写set 和 get 方法,内部利用runtime 给属性赋值和取值
char nameKey;
- (void)setName:(NSString *)name {
// 将某个值跟某个对象关联起来,将某个值存储到某个对象中
objc_setAssociatedObject(self, &nameKey, name, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
- (NSString *)name {
return objc_getAssociatedObject(self, &nameKey);
}



第七城市

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台