iOS AssociatedObject实现原理

关联对象存储位置

  1. 全局单例AssociationsManager管理并维护AssociationsHashMap
  2. 对象的指针及其对应的ObjectAssociationMap以键值对的形式存储于AssociationsHashMap(PS:每一个对象都有一个标记位 has_assoc 指示对象是否含有关联对象)
  3. ObjcAssociation以键值对的形式存储于ObjectAssociationMap
    (键即为自定义的值,比如关联对象为command,键可为@selector(commands))
  4. 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; }
};

关联对象的释放时机

  1. 关联对象的释放时机与被移除的时机并不总是一致的,在使用弱引用的关联对象时要非常小心
  2. 一个对象的所有关联对象是在这个对象被释放时调用的 _object_remove_assocations 函数中被移除的

比较好的参考文章:

  1. 关联对象 AssociatedObject 完全解析
  2. Objective-C Associated Objects 的实现原理
  3. Objc-runtime源码地址

你可能感兴趣的:(iOS AssociatedObject实现原理)