ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

关联对象objc_setAssociatedObject和objc_getAssociatedObject

2021-09-06 08:03:16  阅读:197  来源: 互联网

标签:setAssociatedObject objc value OBJC getAssociatedObject key ASSOCIATION


一、关于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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有