关联对象本质

186 阅读1分钟

关联对象的核心对象有:AssociationManager、AssociationHashMap、ObjectAssociationMap、ObjcAssociation

1. 初始化
AssociationsManager对象
2. 获取AssociationsManager中的静态变量AssociationsHashMap
3. 用DISGUISE函数获取对象地址的反码disguised_object
4.
将对象地址的反码作为key,在AssociationsHashMap哈希表中查找key为disguised_objectObjectAssociationMap类型的对象
5. 
如果在第4步中找到ObjectAssociationMap,则继续根据我们传入的关联key继续在ObjectAssociationMap表中查找对应的ObjcAssociation对象,如果找到了,取出其中的value

6.如果在第5步中没找到ObjcAssociation,则该key不存在关联的值
7. 如果在第4步中没有找到ObjectAssociationMap ,则该对象没有设置过关联属性
8. 根据关联策略决定是否对查询到的value进行retain操作或则autorelease


AssociationsManager可重复创建,
但是AssociationsHashMapAssociationsManager内的静态变量,全局只有一个,负责管理所有对象的关联表。
通过对象地址的反码取出该对象的属性关联表ObjectAssociationMap。然后再通过关联key从对象关联表中获取对应的ObjectAssociationObjectAssociation内存储的就是真正需要的存储的value值和内存关联策略policy了。


关联对象并不存储在被关联对象object本身内存中,而是存储在全局的一个AssociationsHashMap中。设置关联对象的value为nil,就相当于移除关联对象。