ios - ¿Objeto débil en un NSDictionary?
automatic-ref-counting weak-references (3)
Me gustaría almacenar una referencia débil a cero en un objeto en un NSDictionary
. Esto es para una referencia a un NSDictionary
principal, por lo que puedo rastrear una estructura grande sin buscar.
No puedo usar __weak
aquí; incluso si mi referencia local es débil, el NSDictionary
almacenará una referencia fuerte al objeto al que se hizo referencia débilmente. Y, por supuesto, NSDictionary
no puede tener objetos nil
.
Estoy en iOS, no en Mac, por lo que NSHashTable
no está disponible. Y solo quiero que un objeto sea débil; el resto aún debe ser fuerte.
(Voy a publicar mi respuesta, así que tengo algo que marcar como aceptado si no hay una mejor respuesta. Pero espero que alguien tenga una mejor respuesta).
En iOS 6+ puede usar NSMapTable y elegir si desea que los objetos y / o las claves sean débiles o fuertes.
Hay una manera incorporada; Solo usa:
[array addObject:[NSValue valueWithNonretainedObject:object]];
Luego, para acceder al objeto más tarde, use:
id object = [[array objectAtIndex:i] nonretainedObjectValue];
Si se ha publicado el valor desde que lo agregó, entonces "objeto" será un puntero no válido en iOS 4.x, y (supongo) será nulo en 5.x con ARC habilitado.
EDIT: mi suposición fue errónea, no es débil según ARC (vea la discusión a continuación).
Me decidí por definir una clase de "contenedor" con un solo miembro, como este:
@interface Parent : NSObject
@property (nonatomic, weak) id parent;
@end
@implementation Parent
@synthesize parent = _parent;
- (id)initWithParent: (id)parent;
{
if (( self = [super init] )) {
_parent = parent;
}
return self;
}
@end
Y usándolo:
id parentRef = [[Parent alloc] initWithParent: parent];
[newElement setObject: parentRef forKey: ParentKey];
Creo que esto funcionará para mí, pero parece una locura que no haya una mejor manera incorporada a Foundation.