iOS
Objetos asociados a Objective-C
Buscar..
Introducción
Presentado por primera vez en iOS 3.1 como parte del tiempo de ejecución de Objective-C, los objetos asociados proporcionan una manera de agregar variables de instancia a un objeto de clase existente (sin subclasificación.
Esto significa que podrá adjuntar cualquier objeto a cualquier otro objeto sin crear subclases.
Sintaxis
void objc_setAssociatedObject (objeto id, void * key, id valor, objc_AssociationPolicy policy)
id objc_getAssociatedObject (id objeto, void * key)
void objc_removeAssociatedObjects (id object)
Parámetros
Param | Detalles |
---|---|
objeto | El objeto existente que desea modificar. |
llave | Básicamente, este puede ser cualquier puntero que tenga una dirección de memoria constante, pero una buena práctica es usar aquí una propiedad computada (getter) |
valor | El objeto que quieres agregar. |
política | La política de memoria para este nuevo value es decir, debe conservarse / asignarse, copiarse, etc. como cualquier otra propiedad que declararía. |
Observaciones
Ejemplo de objeto asociado básico
Supongamos que necesitamos agregar un objeto SomeClass
a SomeClass
(no podemos SomeClass
subclase).
En este ejemplo, no solo creamos un objeto asociado, sino que también lo envolvemos en una propiedad computada en una categoría para una mayor limpieza.
#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));
}
Ahora sería tan fácil como esto utilizar la propiedad.
SomeClass *instance = [SomeClass alloc] init];
instance.associated = @"this property is an associated object under the hood";