5

Как мы знаем, мы можем добавить переменную в Objective-C, используя методы категории и времени выполнения, такие как objc_setAssociatedObject и objc_getAssociatedObject. Например:Как работает objc_setAssociatedObject?

#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?

+1

Любые причины не только использования имущества? Я постараюсь не вмешиваться во время выполнения, не понимая, как это работает. –

+3

[Здесь] (http://www.opensource.apple.com/source/objc4/objc4-532/runtime/objc-runtime.mm) их реализация. –

+1

@ H2CO3, файл с действительно интересным кодом - objc-references.mm: http://www.opensource.apple.com/source/objc4/objc4-532/runtime/objc-references.mm –

ответ

8

Код для связанных объектов находится в objc-references.mm в режиме выполнения Objective-C.

Если я правильно понимаю, есть один глобальный хэш-карта (static AssociationsHashMap *_map в class AssociationsManager), который отображает адрес объекта («замаскирован», как uintptr_t) к ObjectAssociationMap.

ObjectAssociationMap хранит все ассоциации для одного конкретного объекта и создается, когда

называют в первый раз для объекта.

ObjectAssociationMap - это карта хэширования, которая отображает key в value и policy.

Когда объект освобожден, _object_remove_assocations() удаляет все ассоциации и высвобождает значения, если необходимо.

+0

Вы правы, существует глобальная карта хэша, принадлежащая среде выполнения, и все связанные объекты хранятся на карте. Большое вам спасибо! – foogry

+0

@wangzz: Добро пожаловать! –