Recherche…


Introduction

Introduits pour la première fois dans iOS 3.1 dans le cadre du runtime Objective-C, les objets associés permettent d’ajouter des variables d’instance à un objet de classe existant (avec sous-classement).

Cela signifie que vous pourrez attacher n'importe quel objet à tout autre objet sans sous-classer.

Syntaxe

  • void objc_setAssociatedObject (objet id, void * key, id value, objc_AssociationPolicy policy)

  • id objc_getAssociatedObject (objet id, void * key)

  • void objc_removeAssociatedObjects (objet id)

Paramètres

Param Détails
objet L'objet existant que vous souhaitez modifier
clé Cela peut être fondamentalement n'importe quel pointeur qui a une adresse mémoire constante, mais une bonne pratique est d'utiliser ici une propriété calculée (getter)
valeur L'objet que vous souhaitez ajouter
politique La politique de mémoire pour cette nouvelle value c.-à-d. Si elle doit être conservée / attribuée, copiée, etc., comme toute autre propriété que vous déclarez

Remarques

Plus de détails ici:

NSHipster

@kostiakoval

kingscocoa

Exemple d'objet associé de base

Supposons que nous ayons besoin d'ajouter un objet NSString à SomeClass (nous ne pouvons pas sous-classe).

Dans cet exemple, nous créons non seulement un objet associé, mais également l'enveloppons dans une propriété calculée dans une catégorie pour une plus grande netteté.

#import <objc/runtime.h>

@interface SomeClass (MyCategory)
// This is the property wrapping the associated object. below we implement the setter and getter which actually utilize the object association
@property (nonatomic, retain) NSString *associated;
@end

@implementation SomeClass (MyCategory)

- (void)setAssociated:(NSString *)object {
    objc_setAssociatedObject(self, @selector(associated), object,
                             OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (NSString *)associated {
    return objc_getAssociatedObject(self, @selector(associated));
}

Maintenant, il serait aussi facile que cela d'utiliser la propriété

SomeClass *instance = [SomeClass alloc] init];
instance.associated = @"this property is an associated object under the hood";



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow