Association 对象关联

关联对象并不是存储在被关联对象本身内存中,而是存储在全局的统一的一个 AssociationManager中(里边有个hashMap)

实现关联对象技术的核心对象有

  • AssociationsManager
  • AssociationsHashMap
  • ObjectAssociationsMap
  • ObjcAssociation
void objc_setAssociationObject(id object, const void * key, id value, objc_AssociationPolicy policy);

`AssociationsManager`内部有一个`AssociationsHashMap`的对象(可以看做字典)
`AssociationsHashMap`字典的key是传过来的object,value是`ObjectAssociationMap`对象(可以看做字典)
`ObjectAssociationMap`字典的key是传过来的key,value是`ObjcAssociation`
`ObjcAssociation`中存放者value和policy

// 伪代码:
class AssociationsManager {
    static AssociationsHashMap *_map;
}

// DenseMap是个map,存放key,value
typedef DenseMap, ObjectAssociationMap> AssociationsHashMap;
typedef DenseMap ObjectAssociationMap;

class ObjcAssociation {
    uintptr_t _policy;
    id _value;
}

原理图:



面试题

1. Category能否添加成员变量?如果可以,如何给Category添加成员变量

不能直接给Category添加成员变量,但是可以间接实现Category添加成员变量的效果

可以通过关联对象的方式给Category添加property属性

你可能感兴趣的:(Association 对象关联)