我们知道,我们可以使用类别和运行时方法在Objective-C中添加变量
objc_setAssociatedObject
和objc_getAssociatedObject
。例如:
#import <objc/runtime.h>
@interface Person (EmailAddress)
@property (nonatomic, readwrite, copy) NSString *emailAddress;
@end
@implementation Person (EmailAddress)
static char emailAddressKey;
- (NSString *)emailAddress {
return objc_getAssociatedObject(self,
&emailAddressKey);
}
- (void)setEmailAddress:(NSString *)emailAddress {
objc_setAssociatedObject(self,
&emailAddressKey,
emailAddress,
OBJC_ASSOCIATION_COPY);
}
@end
但有人知道objc_getAssociatedObject
或objc_setAssociatedObject
做了什么吗?
我的意思是,我们添加到对象(这里是self
)的变量存储在哪里?以及变量和self
之间的关系?
答案 0 :(得分:8)
关联对象的代码位于objc-references.mm 在Objective-C运行时。
如果我理解正确,有一个全局哈希映射(static AssociationsHashMap *_map
中的class AssociationsManager
)将对象的地址(“伪装成uintptr_t
)映射到{{ 1}}。
ObjectAssociationMap
存储一个特定对象的所有关联并创建
什么时候
ObjectAssociationMap
第一次为对象调用。
void objc_setAssociatedObject(id object, void *key, id value, objc_AssociationPolicy policy)
是一个哈希地图,可将ObjectAssociationMap
映射到key
和value
。
取消分配对象后,policy
将删除所有关联
并在必要时释放值。