关联对象会用被关联对象作为key,将关联对象存储到全局的哈希表里。
AssociationHashMap
AssociationsHashMap
是用来存储关联对象的哈希表。
class AssociationsHashMap : public unordered_map
<disguised_ptr_t, ObjectAssociationMap *,
DisguisedPointerHash, DisguisedPointerEqual,
AssociationsHashMapAllocator> {
public:
void *operator new(size_t n) { return ::malloc(n); }
void operator delete(void *ptr) { ::free(ptr); }
}
AssociationsHashMap
是继承的unordered_map
, unordered_map
是一个无序的键值对容器。unordered_map定义
键的类型是disguised_ptr_t
, 值的类型是ObjectAssociationMap *
。
disguised_ptr_t
typedef uintptr_t disguised_ptr_t;
typedef unsigned long uintptr_t;
哈希表的key是disguised_ptr_t
类型的,他其实是被关联的对象经过处理得到的:
//object是被关联的对象
disguised_ptr_t disguised_object = DISGUISE(object);
ObjectAssociationMap
哈希表的value是ObjectAssociationMap *
类型的,ObjectAssociationMap也是一个map:
class ObjectAssociationMap : public std::map<void *, ObjcAssociation,
ObjectPointerLess, ObjectAssociationMapAllocator> {
public:
void *operator new(size_t n) { return ::malloc(n); }
void operator delete(void *ptr) { ::free(ptr); }
};
这个哈希表的key就是关联对象的key,哈希表的value是 ObjcAssociation类型的对象
ObjectAssociationMap *refs = new ObjectAssociationMap;
(*refs)[key] = ObjcAssociation(policy, new_value);
object->setHasAssociatedObjects();
ObjcAssociation
ObjcAssociation是用来存储关联对象的:
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; }
};
网友评论