这个问题已经有了答案:
How is Associative Reference implemented?
2答
如我们所知,我们可以使用类和运行时方法在Objtovi-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
之间的关系? 最佳答案
关联对象的代码位于objc-references.mm
在objective-c运行时。
如果我理解正确,有一个全局哈希映射(static AssociationsHashMap *_map
inclass AssociationsManager
)将对象的地址(“伪装”为uintptr_t
)映射到ObjectAssociationMap
。ObjectAssociationMap
存储一个特定对象的所有关联并创建
什么时候?
void objc_setAssociatedObject(id object, void *key, id value, objc_AssociationPolicy policy)
是第一次调用对象。
ObjectAssociationMap
是将key
映射到value
和policy
的哈希映射。当对象被解除分配时,
_object_remove_assocations()
将删除所有关联并在必要时释放值。
关于objective-c - objc_setAssociatedObject如何工作? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17678298/