objc_setAssociatedObject如何工作?

foo*_*gry 7 objective-c objective-c-runtime objective-c-category

因为我们知道,我们可以添加使用类别和运行方法,如在Objective-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
Run Code Online (Sandbox Code Playgroud)

但有人知道做什么objc_getAssociatedObjectobjc_setAssociatedObject做什么?我的意思是,我们添加到对象(这里self)的变量存储在哪里?和变量之间的关系self

Mar*_*n R 8

关联对象的代码 位于Objective-C运行时的objc-references.mm中.

如果我理解正确的话,有一个全局哈希映射(static AssociationsHashMap *_mapin class AssociationsManager)将对象的地址("伪装成" uintptr_t)映射到ObjectAssociationMap.

ObjectAssociationMap 存储一个特定对象的所有关联,并在以下时创建

void objc_setAssociatedObject(id object, void *key, id value, objc_AssociationPolicy policy)
Run Code Online (Sandbox Code Playgroud)

被称为对象的第一次.

ObjectAssociationMap是一个哈希映射,映射keyvaluepolicy.

取消分配对象时,_object_remove_assocations()删除所有关联并在必要时释放值.