版权声明:原创文章,未经允许禁止转载! https://blog.csdn.net/mlibai/article/details/47732889
在某些情况下,我们可能需要在Category中为类添加属性,但是Category中无法生成实例变量,所以需要用到运行时的值动态绑定功能。
// 在 .h 文件中
@interface NSObject (SomeCategory)
@property (nonatomic, strong, setter=xx_setValue:) id xx_value;
@end
// 在 .m 文件中
#import <objc/runtime.h>
static const void *_value = &_value;
@implementation NSObject (SomeCategory)
- (id)xx_value {
return objc_getAssociatedObject(self, _value);
}
- (void)xx_setValue:(id)xx_value {
objc_setAssociatedObject(self, _value, xx_value, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end
关于用于对象关联所使用的唯一标识符(上面例子中的_value),建议使用私有静态变量的地址,以保证唯一性和安全性。不过,也有开发大牛推荐用 @selector(property) 的,但是个人以为这样做外部可以访问到标识符,安全性就降低了。
值关联内存管理策略:
- OBJC_ASSOCIATION_ASSIGN:被关联的对象引用计数不变。虽然头文件的注解中写着 “Specifies a weak reference”,但是这里的 weak 只表示不是强引用,而非能自动置为 nil 的弱引用。
- OBJC_ASSOCIATION_RETAIN_NONATOMIC:被关联的对象引用计数+1,非原子性。
- OBJC_ASSOCIATION_COPY_NONATOMIC:被关联的对象将被复制,并关联复制后的对象,非原子性。
- OBJC_ASSOCIATION_RETAIN:被关联的对象引用计数+1,原子性
- OBJC_ASSOCIATION_COPY:被关联的对象将被复制,并关联复制后的对象,原子性。