Objective-C类目Category属性的实现方法

版权声明:原创文章,未经允许禁止转载! 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:被关联的对象将被复制,并关联复制后的对象,原子性。

猜你喜欢

转载自blog.csdn.net/mlibai/article/details/47732889