Objective-C 在Categroy中创建属性(Property)
Objective-c中category是不能直接创建属性的,这时候我们要用到Objc的runtime来实现
用到的方法有两个
一个是get方法 一个set方法
//get方法
objc_getAssociatedObject(<#id object#>, <#const void *key#>)
//set方法
objc_setAssociatedObject(<#id object#>, <#const void *key#>, <#id value#>, <#objc_AssociationPolicy policy#>)
先来解剖一下
1.get 方法
看字面意思,方法中第一个参数为对象,第二个为key
那么就是获取当前对象的某个key的值
2.set 方法
第一个同样为对象,第二个为key,第三个为value,第四个为属性的类型(相当于设置assign,weak,strong,copy等)
既然同样要用到key,那么意思很简单了,key就是对应我们这个属性的,通过key取值,通过key设值
文本使用uiview的categroy作为例子
首先新建一个category的 class
然后就是 创建属性
在.h 中 加入
@property (assign,nonatomic) CGFloat someHeight;
然后在.m中 实现 set和get方法
这里我用的是CGFloat类型
由于objc给某个key设值的是对象,我们还要用到NSNumber进行一个转换
/** 创建key */ static const char kSomeHeightKey = '\0'; /** set 方法 */ - (void)setSomeHeight:(CGFloat)someHeight{ //存 NSNumber *value = CGFLOAT_IS_DOUBLE?[NSNumber numberWithDouble:someHeight]:[NSNumber numberWithFloat:someHeight]; objc_setAssociatedObject(self, &kSomeHeightKey, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } /** get 方法 */ - (CGFloat)someHeight{ // 取 由于从key中获取到的是对象(存的也是) 要进行一个对象转换. // 若类型是对象类型则不需要本转换 直接return objc_getAssociatedObject(object,&key); NSNumber *value = objc_getAssociatedObject(self, &kSomeHeightKey); return CGFLOAT_IS_DOUBLE?[value doubleValue]:[value floatValue]; }
运行效果
如有错误请指正:) 欢迎交流