iOS
Aan Objective-C gekoppelde objecten
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
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";