Al agregar elementos a NSMutableDictionary
utilizando el método setValue:forKey:
(supongo que esto se generaliza a cualquier NSObject
) ¿retiene el diccionario el segundo parámetro, el NSString
?¿[NSMutableDictionary setValue: value forKey: key] retiene la clave NSString?
Por ejemplo:
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
NSString *theString = @"hello";
int i;
for (i=0; i<[theString length]; i++){
NSNumber *myInt = [NSNumber numberWithInt:i];
NSString *character = [NSString stringWithFormat:@"%C",[theString characterAtIndex:i]];
[dict setValue: myInt forKey:character];
}
[dict release];
[pool release];
Claramente, no hay razón para liberar myInt
en el bucle, es retenido por dict
por lo que no puede ser liberado hasta que el final del código. ¿Pero es lo mismo cierto para character
? Mi pensamiento es que si NSMutableDictionary
almacena la cadena de alguna otra forma, entonces se podría crear un grupo temporal alrededor del ciclo y liberar esas cadenas en lugar de esperar hasta el lanzamiento del diccionario.
También estoy curioso en cuanto a por qué retainCount
de character
es 7fffffff como si se trata de una NSConstantString
, esperaría stringWithFormat
para devolver un objeto NSString
que habría que retener, pero eso no parece ser el caso.
Simplemente un punto fino que no merece una respuesta: en el código para 10.4 y posterior, generalmente es preferible utilizar [sumidero de piscina] en su lugar: cuando el GC está encendido, el drenaje proporciona una pista de que * podría * ser un buen es hora de recopilar referencias antiguas, mientras que la publicación se convierte en no operativa. Con GC desactivado, funcionan de manera idéntica. –
Esta es una vieja pregunta, pero probablemente quieras usar 'setObject: forKey:' en su lugar. [ver aquí] (http://stackoverflow.com/questions/1249634/wheres-the-difference-between-setobjectforkey-and-setvalueforkey-in-nsmutabl) –