iOS
Objektiv-C associerade objekt
Sök…
Introduktion
Första introducerades i iOS 3.1 som en del av Objekt-C-runtime, tillhörande objekt ger ett sätt att lägga till instansvariabler till ett befintligt klassobjekt (w \ o subclassing).
Detta innebär att du kan knyta ett objekt till något annat objekt utan att underklassera.
Syntax
void objc_setAssociatedObject (id-objekt, void * -nyckel, id-värde, objc_AssociationPolicy-policy)
id objc_getAssociatedObject (id-objekt, void * -tangent)
void objc_removeAssociatedObjects (id-objekt)
parametrar
Param | detaljer |
---|---|
objekt | Det befintliga objektet du vill ändra |
nyckel | Detta kan i princip vara vilken som helst pekare som har en konstant minnesadress, men en trevlig praxis är att använda en datoregenskap här (getter) |
värde | Objektet du vill lägga till |
politik | Minnespolicyn för det här nya value dvs skulle det behållas / tilldelas, kopieras osv. Precis som alla andra egenskaper du skulle förklara |
Anmärkningar
Grundläggande associerat objektexempel
Antag att vi måste lägga till ett NSString-objekt till SomeClass
(vi kan inte underklass).
I det här exemplet skapar vi inte bara ett tillhörande objekt utan också lindar det i en datoregenskap i en kategori för extra snygghet
#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 skulle det vara lika enkelt som detta att använda fastigheten
SomeClass *instance = [SomeClass alloc] init];
instance.associated = @"this property is an associated object under the hood";