Est-ce que [NSMutableDictionary setValue: valeur forKey: key] conserver NSString clé?

Lors de l'ajout d'éléments à NSMutableDictionary à l'aide de la setValue:forKey: méthode (je suppose que cela se généralise à toute NSObject) le dictionnaire de conserver la deuxième paramètre, la NSString?

Par exemple:

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];

Clairement, il n'y a pas de raison de la libération myInt dans la boucle, il est conservé par dict donc il ne peut pas être libéré jusqu'à la fin du code. Mais qui est le vrai même de character? Ma pensée est que si NSMutableDictionary magasins de la chaîne en une autre manière, on pourrait alors créer un temporaire de la piscine autour de la boucle et de la libération de ces chaînes au lieu d'attendre jusqu'à la publication du dictionnaire.

Je suis également curieux de savoir pourquoi retainCount de character est 7fffffff comme si c'est un NSConstantString, je m'attends à ce stringWithFormat de retour d'un NSString objet qui aurait besoin de soutènement, mais qui ne semble pas être le cas.

  • Juste une pointe fine qui ne méritent pas de réponse: dans le code de 10.4 et plus tard, il est généralement préférable d'utiliser [drain de la piscine] au lieu — lors de la GC est sur, les égoutter offre un soupçon qu'il pourrait être un bon moment pour recueillir des anciennes références, alors que la libération devient un no-op. Avec GC, ils fonctionnent de manière identique.
  • C'est une vieille question, mais vous avez probablement censé utiliser setObject:forKey: à la place. voir ici
InformationsquelleAutor | 2009-03-22