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

在某些情况下,我们可能需要在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:被关联的对象将被复制,并关联复制后的对象,原子性。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值