现在你准备用一个系统的类,但是系统的类并不能满足你的需求,你需要额外添加一个属性。
这种情况的一般解决办法就是继承。
但是,只增加一个属性,就去继承一个类,总是觉得太麻烦类。
这个时候,runtime的关联属性就发挥它的作用了。
其实,你还可以把添加和获取关联对象的方法写在你需要用到这个功能的类的类别中,方便使用。
- (NSObject *)property {
return objc_getAssociatedObject(self, @selector(property));
}
- (void)setProperty:(NSObject *)value {
objc_setAssociatedObject(self, @selector(property), value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
解释一下上面的代码,property就是你要添加的属性。那么重写他的get方法,也就是说现在property获取到的事通过 objc_getAssociatedObject 获取到的东西。
然后objc_getAssociatedObject 获取到的东西就是 objc_setAssociatedObject 设置的东西。
objc_setAssociatedObject的意思就是 给当前这个类(self)添加一个 叫value的 关联属性,而且属性的唯一Id叫 @selector(property)。关联策略是 retain_nonatomic....
- id object给谁设置关联对象。
- const void *key关联对象唯一的key,获取时会用到的主键。
- id value关联对象。
- objc_AssociationPolicy关联策略,有以下几种策略:
enum {
OBJC_ASSOCIATION_ASSIGN = 0,
OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1,
OBJC_ASSOCIATION_COPY_NONATOMIC = 3,
OBJC_ASSOCIATION_RETAIN = 01401,
OBJC_ASSOCIATION_COPY = 01403
};