關(guān)聯(lián)對(duì)象存儲(chǔ)位置
- 全局單例
AssociationsManager
管理并維護(hù)AssociationsHashMap
- 對(duì)象的指針及其對(duì)應(yīng)的
ObjectAssociationMap
以鍵值對(duì)的形式存儲(chǔ)于AssociationsHashMap
(PS:每一個(gè)對(duì)象都有一個(gè)標(biāo)記位 has_assoc 指示對(duì)象是否含有關(guān)聯(lián)對(duì)象) -
ObjcAssociation
以鍵值對(duì)的形式存儲(chǔ)于ObjectAssociationMap
(鍵即為自定義的值,比如關(guān)聯(lián)對(duì)象為command
,鍵可為@selector(commands)
) -
ObjcAssociation
便是實(shí)際的關(guān)聯(lián)對(duì)象
ObjcAssociation 代碼如下,主要存儲(chǔ)了
- 關(guān)聯(lián)策略(類似于不同的屬性修飾符)
- 實(shí)際關(guān)聯(lián)的屬性值
class ObjcAssociation {
uintptr_t _policy;
id _value;
public:
ObjcAssociation(uintptr_t policy, id value) : _policy(policy), _value(value) {}
ObjcAssociation() : _policy(0), _value(nil) {}
uintptr_t policy() const { return _policy; }
id value() const { return _value; }
bool hasValue() { return _value != nil; }
};
關(guān)聯(lián)對(duì)象的釋放時(shí)機(jī)
- 關(guān)聯(lián)對(duì)象的釋放時(shí)機(jī)與被移除的時(shí)機(jī)并不總是一致的,在使用弱引用的關(guān)聯(lián)對(duì)象時(shí)要非常小心
- 一個(gè)對(duì)象的所有關(guān)聯(lián)對(duì)象是在這個(gè)對(duì)象被釋放時(shí)調(diào)用的 _object_remove_assocations 函數(shù)中被移除的
比較好的參考文章: