Category 添加 property

一开始Google了解到在iOS开发中的Category是不可以添加property的,via:StackOverFlow,其实当时我是信的,但是后来发现在别的开源代码中readonly属性的property能够在运行时给它们赋值操作,借助于Objective-C Runtime中的关联,所谓关联是指把两个对象相互关联起来,使得其中的一个对象作为另外一个对象的一部分。

两个主要方法

id objc_getAssociatedObject ( id object, const void *key );
void objc_setAssociatedObject ( id object, const void *key, id value, objc_AssociationPolicy policy );

使用方法

- (NSString *)aString {
    return objc_getAssociatedObject(self, @selector(aString));
}

- (void)setaString:(NSString *)aString {
    objc_setAssociatedObject(self, @selector(aString), otherString, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

其他注意

  1. 对于基本类型如NSInteger、BOOL的assign类型property,可以先转成NSNumber来设置关联,获取关联对象返回的时候再转回对应类型
  2. 注意OBJC_ASSOCIATION_ASSIGN等等的几个属性设置