Category - 关联对象
关联对象
- 默认情况下,因为分类底层结构的限制,不能添加==成员变量==到分类中,但可以通过==关联对象==来间接实现
- 关联对象提供了以下API:
- 添加关联对象
- void objc_setAssociatedObject(id object, const void * key,
id value, objc_AssociationPolicy policy)
- void objc_setAssociatedObject(id object, const void * key,
- 获得关联对象
- id objc_getAssociatedObject(id object, const void * key)
- 移除所有的关联对象
- void objc_removeAssociatedObjects(id object)
- 添加关联对象
key的常见用法
1 | static void *MyKey = &MyKey; |
objc_AssociationPolicy,关联策略
1 | objc_AssociationPolicy 对应的修饰符 |
关联对象的原理
- 实现关联对象技术的核心对象有
- AssociationsManager
- AssociationsHashMap
- ObjectAssociationMap
- ObjcAssociation
objc4源码:objc-references.mm
AssociationsManager
1 | class AssociationsManager { |
AssociationsHashMap
1 | class AssociationsHashMap : public unordered_map<disguised_ptr_t, ObjectAssociationMap *, DisguisedPointerHash, DisguisedPointerEqual, AssociationsHashMapAllocator> { |
ObjectAssociationMap
1 | class ObjectAssociationMap : public std::map<void *, ObjcAssociation, ObjectPointerLess, ObjectAssociationMapAllocator> { |
ObjcAssociation
1 | class ObjcAssociation { |
notes:
- 关联对象并不是存储在被关联对象本身内存中
- 关联对象存储在全局的统一的一个AssociationsManager中
- 设置关联对象为nil,就相当于是移除关联对象
- 即为以下的关系:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16AssociationsManager
AssociationsHashMap *_map;
AssociationsHashMap
disguised_ptr_t ObjectAssociationMap
disguised_ptr_t ObjectAssociationMap
... ...
AssociationsMap
void * ObjectAssociation
void * ObjectAssociation
... ...
ObjectAssociation
uintptr_t _policy;
id _value;
参考
李明杰老师课件- objc源码
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ivan's Blog!
评论









