7

objc_setAssociatedObjectご存知のように、カテゴリとやなどのランタイム メソッドを使用して、Objective-C に変数を追加できます 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_getAssociatedObjectobjc_setAssociatedObject? つまり、オブジェクトに追加する変数 (ここではself) はどこに保存されているのでしょうか? self変数と?の関係

4

1 に答える 1

9

関連オブジェクトのコードは 、Objective-C ランタイムのobjc-references.mmにあります。

私がそれを正しく理解していれば、オブジェクトのアドレス(「偽装」)をにマップする1つのグローバルハッシュマップ( )がありstatic AssociationsHashMap *_mapます。class AssociationsManageruintptr_tObjectAssociationMap

ObjectAssociationMap1 つの特定のオブジェクトのすべての関連付けを格納し、次の場合に作成されます。

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

オブジェクトに対して初めて呼び出されます。

ObjectAssociationMapkeyvalueとにマップするハッシュ マップですpolicy

オブジェクトの割り当てが解除されると、_object_remove_assocations()すべての関連付けが削除され、必要に応じて値が解放されます。

于 2013-07-16T14:27:43.800 に答える