在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
Objective-c中category是不能直接创建属性的,这时候我们要用到Objc的runtime来实现 用到的方法有两个 一个是get方法 一个set方法 //get方法 先来解剖一下 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]; } 运行效果
如有错误请指正:) 欢迎交流 |
请发表评论