2009-12-08 11 views
1

Y at-il un inconvénient à utiliser NSSet comme clé dans NSMutableDictionary, des pièges à connaître, des performances énormes?Cocoa: Y at-il des inconvénients à utiliser NSSet comme clé dans NSMutableDictionary?

Je pense que les clés sont copiées dans des conteneurs Cocoa, cela signifie-t-il que NSSet est copié dans le dictionnaire? Ou y a-t-il une optimisation qui retient le NSSet dans ce cas?

liés à Can a NSDictionary take in NSSet as key?

Exemple Code:

NSMutableDictionary * dict = [NSMutableDictionary dictionary]; 

NSSet * set; 
set = [NSSet setWithObjects:@"a", @"b", @"c", @"d", nil]; 
[dict setObject:@"1" forKey:set]; 

set = [NSSet setWithObjects:@"b", @"c", @"d", @"e", nil]; 
[dict setObject:@"2" forKey:set]; 

id key; 
NSEnumerator * enumerator = [dict keyEnumerator]; 
while ((key = [enumerator nextObject])) 
    NSLog(@"%@ : %@", key, [dict objectForKey:key]); 

set = [NSSet setWithObjects:@"c", @"b", @"e", @"d", nil]; 
NSString * value = [dict objectForKey:set]; 
NSLog(@"set: %@ : key: %@", set, value); 

Sorties:

2009-12-08 15:42:17.885 x[4989] (d, e, b, c) : 2 
2009-12-08 15:42:17.887 x[4989] (d, a, b, c) : 1 
2009-12-08 15:42:17.887 x[4989] set: (d, e, b, c) : key: 2 

Répondre

4

Je pense que les clés sont copiées dans des conteneurs de cacao, cela signifie NSSet est copié dans le dictionnaire? Ou y a-t-il une optimisation qui retient le NSSet dans ce cas?

Les dictionnaires NS copient leurs clés.

Un ensemble immuable répondra probablement à copy en retournant lui-même conservé, rendant la "copie" pratiquement libre. Un ensemble mutable répondra à copy en retournant une copie de lui-même, c'est pourquoi l'utilisation d'objets mutables en tant que clés est généralement une mauvaise idée (vous ne pourrez pas trouver l'original après l'avoir muté car il ne compare plus égal à la clé dans le dictionnaire).

+0

+1, oui Je ne considère que les instances immuables, je comprends qu'il serait problématique d'avoir des clés mutables. – stefanB

3

Ooh. Oui. Il y a un gros inconvénient de performance. Il arrive que est implémenté comme [set count]. Cela signifie que si tous vos ensembles ont 2 objets, disons, ils ont tous le même hachage, et la collection fonctionnera très mal.