面试题引发的思考:
Q: 简单介绍一下关联对象原理?
- 关联对象由 全局的结构
AssociationManager
管理,并在AssociationsHashMap
存储;- 所有对象的关联内容都在 同一个全局容器 中。
- 一个实例对象 对应 一个
AssociationsHashMap
;AssociationsHashMap
中存储着 多个此实例对象 的关联对象的Key
和ObjcAssociation
;ObjcAssociation
存储着关联对象的value
和policy
策略。
关联对象原理:
先介绍一下实现关联对象技术的核心对象:
AssociationsManager
AssociationsHashMap
ObjectAssociationMap
ObjectAssociation
源码中出现的
Map
相关的方法,与OC中的字典类似,包含key
、value
,存在类似对应关系。
由以上源码可以得出四个核心对象的结构:
而这四个核心对象的关系如下:
以上可以总结为:
- 一个实例对象对应一个
AssociationsHashMap
;AssociationsHashMap
中存储着多个此实例对象的关联对象的Key
和ObjcAssociation
;ObjcAssociation
存储着关联对象的value
和policy
策略。关联对象的值它不是存储在自己的实例对象的结构中,而是维护了一个全局的结构
AssociationManager
。
(1) objc_setAssociatedObject:
函数解读:
由源码可知:
objc_setAssociatedObject:
函数按照核心的关系一层一层的将数据存储完成。
(2) objc_getAssociatedObject:
函数解读:
由源码可知:
objc_getAssociatedObject:
函数如objc_setAssociatedObject:
函数一样,按照反向顺序一层一层获取value
。
(3) objc_removeAssociatedObjects:
函数解读:
由源码可知:
_object_remove_assocations:
函数会将object
对象对应的所有关联对象全部删除。
总结可知:
- 关联对象并不是存储在被关联对象本身内存中,而是存储在全局的统一的一个
AssociationsManager
中;- 如果设置关联对象为
nil
,就相当于是移除关联对象。·