关联对象并不是存储在被关联对象本身内存中,而是存储在全局的统一的一个 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属性