其他分享
首页 > 其他分享> > 关联对象objc_setAssociatedObject和objc_getAssociatedObject

关联对象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