關(guān)聯(lián)對象并不是存儲在被關(guān)聯(lián)對象本身內(nèi)存中,而是存儲在全局的統(tǒng)一的一個 AssociationManager中(里邊有個hashMap)
實現(xiàn)關(guān)聯(lián)對象技術(shù)的核心對象有
- AssociationsManager
- AssociationsHashMap
- ObjectAssociationsMap
- ObjcAssociation
void objc_setAssociationObject(id object, const void * key, id value, objc_AssociationPolicy policy);
`AssociationsManager`內(nèi)部有一個`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添加成員變量,但是可以間接實現(xiàn)Category添加成員變量的效果
可以通過關(guān)聯(lián)對象的方式給Category添加property屬性