ios nsdictionary automatic-ref-counting weak-references

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.