关联对象的作用:
关联对象可以给某个对象关联一个或者多个其他对象,这些对象通过健来区分。
创建存储关联对象objc_setAssociatedObject:通过objc_setAssociatedObject把一个对象与另外一个对象进行关联。相当于 setValue:forKey 进行关联value对象。
void objc_setAssociatedObject(id _Nonnull object, const void * _Nonnull key, id _Nullable value, objc_AssociationPolicy policy)
* 第一个参数:object 被关联的对象(源对象)
* 第二个参数:key 要关联的对象的key,一般设置成全局静态变量。要保证全局唯一,key与关联的对象是一一对应关系。
* 第三个参数:value 关联的对象
* 第四个参数:policy 关联时采用的协议,即存储策略(枚举类型)
关联协议objc_AssociationPolicy:关联策略表明了相关的对象是通过赋值,保留引用还是复制的方式进行关联的
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/**< Specifies that the associated object is copied.
};
* OBJC_ASSOCIATION_ASSIGN 相当于@property的assign
* OBJC_ASSOCIATION_RETAIN_NONATOMIC 相当于@property的nonatomic + retain
* OBJC_ASSOCIATION_COPY_NONATOMIC 相当于@property的nonatomic + copy
* OBJC_ASSOCIATION_RETAIN 相当于@property的retain
* OBJC_ASSOCIATION_COPY 相当于@property的copy
获取关联对象objc_getAssociatedObject:用来读取关联对象
id _Nullable objc_getAssociatedObject(id _Nonnull object,const void * _Nonnull key)
* 第一个参数:object 要读取的关联对象的源对象。
* 第二个参数:key 要读取关联对象对应的key值。
移除关联对象objc_removeAssociatedObjects:移除某个对象身上的所有关联的对象。(通常情况下不建议使用这个函数,只有在需要把对象恢复到“原始状态”的时候才会使用这个函数。)
void objc_removeAssociatedObjects(id _Nonnull object)
* 第一个参数:object 要移除关联对象的源对象。
ps:objc_removeAssociatedObjects方法是移除object上的所有关联对象。所以如果我们只是需要移除object上面的一条关联对象,可以通过objc_setAssociatedObject函数传入nil的方式来达到移除某个关联对象的目的。