Association 對象關(guān)聯(lián)

關(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屬性
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容