关联对象其实是通过初始化一个AssociationsManager 来对全局唯一的哈希链表AssociationsHashMap进行管理关系对象,结构为:
{ object1:{key1:value1,ke2:value2,.....},
object2:{key1:value1,ke2:value2,.....},
.......
}
如果设置的value值为nil,那么会清除hashMap里面对应的值
在关系对象dealloc释放的时候也会同时释放关系属性,这里会先判断该对象是否有标记过关联对象,通过isTaggedPointer() 里面的uintptr_t has_assoc: 1 位来标记.
在manager构建的时候会加lock ,在manager析构的时候会unlock 来保证对map的线程安全访问。具体关系如下图: