objc_setAssociatedObject如何工作?

时间:2013-07-16 13:47:24

标签: 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

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

1 个答案:

答案 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映射到keyvalue

取消分配对象后,policy将删除所有关联 并在必要时释放值。