在iOS设计Category中,默认不能直接添加属性,如果分类中通过property修饰的属性,只会生成setter和getter的声明,
不会生成其实现;因此,如果一定要添加属性的话,需要借助runtime特性,通过 objc_setAssociatedObject(self, &valueKey, value, OBJC_ASSOCIATION_COPY_NONATOMIC)设置值,由objc_getAssociatedObject(self, &valueKey)函数获取值。
具体实现如下:
NSObject+Extension.h中
// 在分类中,默认通过property修饰的属性,只会生成setter和getter的声明,不会生成其实现
@property (nonatomic, copy) NSString *value;
NSObject+Extension.m中
#import "NSObject+Extension.h"
#import <objc/runtime.h>
@implementation NSObject (Extension)
static char valueKey; // 关联属性值的key
- (void)setValue:(NSString *)value
{
// 将某个值 跟 某个对象关联起来
// 将某个值 存储到 某个对象中
objc_setAssociatedObject(self, &valueKey, value, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
- (NSString *)value
{
// 通过valueKey取value值
return objc_getAssociatedObject(self, &valueKey);
}
@end
测试..........................................................................
- (void)viewDidLoad {
[super viewDidLoad];
NSString *str = @"jack";
str.value = @"abc";
self.value = @"哈哈哈";
NSLog(@"%@,%@ ", str.value, self.value);
}
运行结果:
2015-06-10 17:07:27.488 运行时的应用-分类增加属性[1698:63864] abc 哈哈哈