Objective-c之Associative

1.概念

Objective-c有两个扩展的category和associative,category相信大家在平时写代码的时候经常用到,category可以给一个类来扩展方法,但它不能扩展属性,利用associative我们可以进行属性的扩展。

2.使用
associative原理就是把两个对象关联起来。比如 我们想给UIView添加一个属性我们就可以用到这个associative。
associative机制提供了三个方法:

//关联策略
typedef OBJC_ENUM(uintptr_t, objc_AssociationPolicy) {
    OBJC_ASSOCIATION_ASSIGN = 0, 
    OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1,
    OBJC_ASSOCIATION_COPY_NONATOMIC = 3, 
    OBJC_ASSOCIATION_RETAIN = 01401, 
    OBJC_ASSOCIATION_COPY = 01403  
};
//为给定对象使用给定的键和关联策略设置关键值
//id object (要添加属性的实例)
//void *key (关键字)
//id value (要添加的属性)
//objc_AssociationPolicy policy (关联策略)
void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
//获取associative对象
//id object(从哪个实例中获取) void *key (根据哪个key)
id objc_getAssociatedObject(id object, const void *key)
//从实例中移除绑定的关联(这里移除的是所有的关联)!!! 
//如果你想移除某一个属性你可以使用objc_setAssociatedObject函数,传入nil值即可。objc_setAssociatedObject(self, KEY, nil, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
void objc_removeAssociatedObjects(id object)

2.1 创建associative

创建associative使用的是:objc_setAssociatedObject。它把一个对象与另外一个对象进行关联。该函数需要四个参数:源对象,关键字,关联的对象、关联策略。
这里主要说一下关联策略 ,关联策略表明相关的对象是通过copy,retain,assign,还有这种关联是原子的还是非原子的。

如我们想给一个UIView添加一个属性:

NSString *value = @"value";
objc_setAssociatedObject(self, KEY_TEST, value, OBJC_ASSOCIATION_COPY_NONATOMIC);

2.2 获取associative对象
获取相关联的是函数objc_getAssociatedObject。

NSObject *obj = objc_getAssociatedObject(self, KEY_TEST);
if ([obj isKindOfClass:[NSString class]] && obj) {
    NSLog(@"Associative value ------%@",obj);
}

2.3.断开associative
断开associative是使用objc_setAssociatedObject函数,传入nil值即可。

objc_setAssociatedObject(self, KEY_TEST, nil, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值