关联对象objc_setAssociatedObject和objc_getAssociatedObject
作者:互联网
一、关于objc_setAssociatedObject和objc_getAssociatedObject的使用,首先需要包含头文件#import <objc/runtime.h>
1、objc_setAssociatedObject
objc_setAssociatedObject(<#id _Nonnull object#>, <#const void * _Nonnull key#>, <#id _Nullable value#>, <#objc_AssociationPolicy policy#>)
如上是objc_setAssociatedObject的各个参数第一个是要关联的对象,第二个是给个自定义的key,第三个是给value,第四个是对应的拷贝方式具体的参数如下所示
typedef OBJC_ENUM(uintptr_t, objc_AssociationPolicy) { OBJC_ASSOCIATION_ASSIGN = 0, /**< Specifies a weak reference to the associated object. */ OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, /**< Specifies a strong reference to the associated object. * The association is not made atomically. */ OBJC_ASSOCIATION_COPY_NONATOMIC = 3, /**< Specifies that the associated object is copied. * The association is not made atomically. */ OBJC_ASSOCIATION_RETAIN = 01401, /**< Specifies a strong reference to the associated object. * The association is made atomically. */ OBJC_ASSOCIATION_COPY = 01403 /**< Specifies that the associated object is copied. * The association is made atomically. */ };
从上面的objc_setAssociatedObject参数可以看出相当于在关联的对象中有隐含的一个dictionary用于存储额外的数值,并且通过最后一个参数指定了value的拷贝方式
注意:如果该id、key、value已经存在,想将该value移除,则可以将value设空,比如:调用objc_setAssociatedObject(id, key, nil,OBJC_ASSOCIATION_ASSIGN); 将对应的value移除
2、objc_getAssociatedObject
objc_getAssociatedObject(<#id _Nonnull object#>, <#const void * _Nonnull key#>)
如上是根据objc_setAssociatedObject设置时候的关联对象和key取出对应的值然后对值进行自己想要的操作
3、objc_removeAssociatedObjects
void objc_removeAssociatedObjects(id _Nonnull object)
如上是要移除指定对象的所有关联key、value
如下是objc_setAssociatedObject和objc_getAssociatedObject这两个函数的可能用法
- (void) askuserAQuestion { void (^ block)() = ^() { NSLog(@"block alret"); }; objc_setAssociatedObject(self, "test_key", block, OBJC_ASSOCIATION_COPY_NONATOMIC); [self alertView]; } - (void) alertView { void (^ block)() = objc_getAssociatedObject(self, "test_key"); block(); }
分析:
1、关联对象相当于在指定的类中增加一个字典,可在字典中增加、移除和取值等操作;并且对增加值的时候可设置复制方式
2、当使用的时候需要注意的是循环引用的问题,比如block中可能对self的捕获导致循环引用
3、如字典的特性在同一个对象中使用的key值需要不一样
4、当要移除指定key的value,则使用设值的方式只是将value置为空即可
标签:setAssociatedObject,objc,value,OBJC,getAssociatedObject,key,ASSOCIATION 来源: https://www.cnblogs.com/czwlinux/p/15232162.html