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];
}

运行效果

 

如有错误请指正:) 欢迎交流

posted @ 2016-01-25 17:01  老徐想减肥  阅读(838)  评论(0编辑  收藏  举报