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<DisguisedPtr<objc_object>, ObjectAssociationMap> AssociationsHashMap;
typedef DenseMap<const void *, ObjcAssociation> ObjectAssociationMap;

class ObjcAssociation {
    uintptr_t _policy;
    id _value;
}

原理图:



面试题

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

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

可以通过关联对象的方式给Category添加property属性
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。