这个问题已经有了答案:
How is Associative Reference implemented?
2答
如我们所知,我们可以使用类和运行时方法在Objtovi-C中添加变量
objc_setAssociatedObjectobjc_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_getAssociatedObjectobjc_setAssociatedObject做什么吗?
我是说,我们添加到对象中的变量(这里是self)存储在哪里?变量和self之间的关系?

最佳答案

关联对象的代码位于objc-references.mm
在objective-c运行时。
如果我理解正确,有一个全局哈希映射(static AssociationsHashMap *_mapinclass AssociationsManager)将对象的地址(“伪装”为uintptr_t)映射到ObjectAssociationMap
ObjectAssociationMap存储一个特定对象的所有关联并创建
什么时候?

void objc_setAssociatedObject(id object, void *key, id value, objc_AssociationPolicy policy)

是第一次调用对象。
ObjectAssociationMap是将key映射到valuepolicy的哈希映射。
当对象被解除分配时,_object_remove_assocations()将删除所有关联
并在必要时释放值。

关于objective-c - objc_setAssociatedObject如何工作? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17678298/

10-10 20:36