Zoeken…


Invoering

Voor het eerst geïntroduceerd in iOS 3.1 als onderdeel van de Objective-C runtime, bieden gekoppelde objecten een manier om instantievariabelen toe te voegen aan een bestaand klasseobject (zonder subklasse).

Dit betekent dat u elk object aan een ander object kunt koppelen zonder subklasse.

Syntaxis

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

  • id objc_getAssociatedObject (id object, void * key)

  • void objc_removeAssociatedObjects (id object)

parameters

Param Details
voorwerp Het bestaande object dat u wilt wijzigen
sleutel Dit kan in principe elke aanwijzer zijn met een constant geheugenadres, maar het is een leuke gewoonte om hier een berekende eigenschap (getter) te gebruiken
waarde Het object dat u wilt toevoegen
het beleid Het geheugenbeleid voor deze nieuwe value dwz als deze wordt behouden / toegewezen, gekopieerd, enz., Net als elke andere eigenschap die u aangeeft

Opmerkingen

Meer details hier:

NSHipster

@kostiakoval

kingscocoa

Basis geassocieerd objectvoorbeeld

Stel dat we een NSString-object moeten toevoegen aan SomeClass (we kunnen geen subklasse gebruiken).

In dit voorbeeld maken we niet alleen een bijbehorend object, maar verpakken we het ook in een berekende eigenschap in een categorie voor extra netheid

#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));
}

Nu zou het net zo eenvoudig zijn om de eigenschap te gebruiken

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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow