2009-09-23 7 views
1

J'ai une instance de NSMutableDictionary et les clés que j'utilise sont de type NSNumber *.Est-ce que objectForKey de NSDictionary recherche une référence ou une valeur?

Dans le scénario que j'ai, j'essaie d'utiliser 'objectForKey' pour récupérer un objet dans mon dictionnaire que je sais est présent. Mais je continue à obtenir zéro pour le résultat sauf si je fais convertir la clé de NSNumber à NSString.

NSNumber *itemId = [NSNumber numberWithInt:5]; 

id *existingItem = [forRemovalLookup objectForKey:itemId]; 
if (existingItem == nil) 
{ 
    // expected: shouldn't be nil 
    NSLog(@"!!!!!Not expecting this to be nil"); 
} 

Y at-il une autre opération que je devrais utiliser pour tester la présence d'une clé spécifique dans un dictionnaire?

+1

Je pense que vous voulez dire ** 'id' ** au lieu de **' id * '** pour votre type de données. Rappelez-vous que 'id' est à peu près équivalent à' void * ', mais il est plus dynamique et ne nécessite aucun casting pour le stocker. (Comme il est, vous avez un pointeur vers un ID, qui fonctionne toujours dans ce cas, mais est sémantiquement faux.) –

+0

A voté pour fermer n'est plus pertinent parce que l'auteur semble avoir trouvé l'erreur. –

Répondre

1

Il serait travail, mais seulement si [itemID hash] était égal au hachage de la clé, et si [itemID isEqual:] retourné vrai par rapport à la clé en question. Je pense que le hash d'un NSNumber est simplement le nombre qu'il contient, mais le hachage d'une chaîne serait complètement différent même s'il s'agissait juste d'une représentation sous forme de chaîne du même nombre. De la mémoire, le hachage d'une chaîne est calculé en multipliant chaque valeur de caractère par la valeur d'un accumulateur multipliée par un certain montant. Il y a peut-être autre chose qui me manque, mais il y a eu une discussion sur la liste de diffusion Cocoa concernant le comportement des classes dans les objets de collection et le consensus général était que si une classe devait bien tenir dans une collection, elle devrait retourner correctement valeurs décentes pour -hash et -isEqual:.

Je sais que cette réponse ne vous aide pas vraiment dans cette situation, mais elle peut nous éclairer sur le fonctionnement des collections de dictionnaires dans Cocoa.

Questions connexes