runtime--实现篇02(Category增加属性)

 

        在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 哈哈哈

 

posted @ 2015-06-10 17:19  guozhong  阅读(187)  评论(0)    收藏  举报