5

Comme nous le savons, nous pouvons ajouter une variable en Objective-C en utilisant une catégorie et des méthodes d'exécution comme objc_setAssociatedObject et objc_getAssociatedObject. Par exemple:Comment objc_setAssociatedObject fonctionne-t-il?

#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 

Mais quelqu'un sait ce qui ne objc_getAssociatedObject ou objc_setAssociatedObject faire? Je veux dire, où sont les variables que nous ajoutons à l'objet (ici self) stockées? Et la relation entre variable et self?

+1

Une raison pour ne pas simplement utiliser la propriété? Je voudrais essayer de ne pas jouer avec le temps d'exécution sans comprendre comment cela fonctionne. –

+3

[Voici] (http://www.opensource.apple.com/source/objc4/objc4-532/runtime/objc-runtime.mm) leur implémentation. –

+1

@ H2CO3, le fichier avec le code réellement intéressant est objc-references.mm: http://www.opensource.apple.com/source/objc4/objc4-532/runtime/objc-references.mm –

Répondre

8

Le code pour des objets associés est en objc-references.mm dans le moteur d'exécution Objective-C.

Si je comprends bien, il y a une carte de hachage globale (static AssociationsHashMap *_map dans class AssociationsManager) qui mappe l'adresse d'un objet (« déguisé » comme uintptr_t) à un ObjectAssociationMap.

ObjectAssociationMap stocke toutes les associations pour un objet particulier et est créé lorsque

est appelé la première fois pour un objet.

ObjectAssociationMap est une carte de hachage qui mappe le key à value et policy. Lorsqu'un objet est désaffecté, _object_remove_assocations() supprime toutes les associations et libère les valeurs si nécessaire.

+0

Vous avez raison, il existe une carte de hachage globale appartenant à runtime, et tous les objets associés sont stockés par la carte.Merci beaucoup! – foogry

+0

@wangzz: Vous êtes les bienvenus! –

Questions connexes