Pregunta

¿Hay alguna desventaja de usar NSSet como clave en NSMutableDictionary, los aspectos críticos a tener en cuenta, cualquier grandes éxitos de rendimiento?

Creo que las claves se copian en contenedores de cacao, significa NSSet se copia al diccionario? ¿O hay alguna optimización que conserva la NSSet en este caso?

Puede un NSDictionary tomar en NSSet como clave?

código de ejemplo:

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

Salidas:

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
¿Fue útil?

Solución

  

Creo que las claves se copian en contenedores de cacao, significa NSSet se copia al diccionario? ¿O hay alguna optimización que conserva la NSSet en este caso?

NSDictionaries hacen copiar sus claves.

Un conjunto inmutable probablemente responder a copy volviendo en sí retenido, por lo que la “copia” prácticamente libre.

Un conjunto mutable responderá a copy devolviendo una copia de sí mismo, por lo que el uso de objetos mutables como claves es generalmente una mala idea (que no será capaz de encontrar el original después mutando porque ya no compara la igualdad a la tecla en el diccionario).

Otros consejos

Ooh. Si. Hay una gran desventaja rendimiento. Sucede que -[NSSet hash] se implementa como [set count]. Eso significa que si todos los conjuntos tienen 2 objetos, por ejemplo, a continuación, todos ellos tienen el mismo hash, y la colección llevará a cabo muy mal.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top