大家好,我是OB!
当我们利用runtime给分类动态添加属性,本质不是给这个对象添加成员变量,而是为这个对象创建一个关联对象,所以在我们objc_setAssociatedObject
添加关联对象后,利用runtime的copyIvarList 是可以发现,根本没有创建新的成员变量的。
- (void)setName:(NSString *)name {
objc_setAssociatedObject(self, "key_name", name, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
- (NSString *)name {
return (NSString *)objc_getAssociatedObject(self, "key_name");
}
那么关联对象添加在哪里呢?
首先了解几个 C ++ 类
AssociationsManager
关联对象的管理者
class AssociationsManager {
static AssociationsHashMap *_map;
public:
AssociationsManager() { AssociationsManagerLock.lock(); }
~AssociationsManager() { AssociationsManagerLock.unlock(); }
AssociationsHashMap &associations() {
if (_map == NULL)
_map = new AssociationsHashMap();
return *_map;
}
};
AssociationsHashMap *AssociationsManager::_map = NULL;
ObjcAssociation
class ObjcAssociation {
uintptr_t _policy;
id _value;
}
AssociationsManager可重复创建,AssociationsManager管理着全局静态变量AssociationsHashMap,它负责管理所有对象的关联表。通过对象地址取出该对象的属性关联表ObjectAssociationMap。然后再通过关联key从对象关联表中获取对应的ObjcAssociation,ObjcAssociation内存储的就是真正存储的value和内存关联策略policy