关联对象objc_setAssociatedObject和objc_getAssociatedObject
一、关于objc_setAssociatedObject和objc_getAssociatedObject的使用,首先需要包含头文件#import <objc/runtime.h>
1、objc_setAssociatedObject
1 | 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置为空即可
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
2020-09-06 关于外键的使用