iOS AssociatedObject实现原理
2017-06-26 本文已影响102人
ThaiLanKing
关联对象存储位置
- 全局单例
AssociationsManager
管理并维护AssociationsHashMap
- 对象的指针及其对应的
ObjectAssociationMap
以键值对的形式存储于AssociationsHashMap
(PS:每一个对象都有一个标记位 has_assoc 指示对象是否含有关联对象) -
ObjcAssociation
以键值对的形式存储于ObjectAssociationMap
(键即为自定义的值,比如关联对象为command
,键可为@selector(commands)
) -
ObjcAssociation
便是实际的关联对象
ObjcAssociation 代码如下,主要存储了
- 关联策略(类似于不同的属性修饰符)
- 实际关联的属性值
class ObjcAssociation {
uintptr_t _policy;
id _value;
public:
ObjcAssociation(uintptr_t policy, id value) : _policy(policy), _value(value) {}
ObjcAssociation() : _policy(0), _value(nil) {}
uintptr_t policy() const { return _policy; }
id value() const { return _value; }
bool hasValue() { return _value != nil; }
};
关联对象的释放时机
- 关联对象的释放时机与被移除的时机并不总是一致的,在使用弱引用的关联对象时要非常小心
- 一个对象的所有关联对象是在这个对象被释放时调用的 _object_remove_assocations 函数中被移除的
比较好的参考文章: