Cocoa: есть ли недостатки в использовании NSSet в качестве ключа в NSMutableDictionary?

Есть ли какие-либо недостатки в использовании NSSet в качестве ключа в NSMutableDictionary, какие-либо ошибки, о которых нужно знать, какие-либо серьезные удары по производительности?

Я думаю, что ключи копируются в контейнеры Cocoa, значит ли это, что NSSet копируется в словарь? Или есть какая-то оптимизация, сохраняющая NSSet в этом случае?

Связано с Может ли NSDictionary использовать NSSet в качестве ключа?

Пример кода:

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

Выходы:

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

person stefanB    schedule 08.12.2009    source источник


Ответы (2)


Я думаю, что ключи копируются в контейнеры Cocoa, значит ли это, что NSSet копируется в словарь? Или есть какая-то оптимизация, сохраняющая NSSet в этом случае?

NSDictionaries копируют свои ключи.

Неизменяемый набор, вероятно, ответит на copy, вернув себя сохраненным, что сделает «копию» практически бесплатной.

Изменяемый набор будет реагировать на copy, возвращая свою копию, поэтому использование изменяемых объектов в качестве ключей, как правило, плохая идея (вы не сможете найти оригинал после его изменения, потому что он больше не сравнивается равным ключу в словаре).

person Peter Hosey    schedule 08.12.2009
comment
+1, да, я рассматриваю только неизменяемые экземпляры, я понимаю, что было бы проблематично иметь изменяемые ключи. - person stefanB; 08.12.2009

Ох. Да. Есть большой недостаток производительности. Бывает, что -[NSSet hash] реализуется как [set count]. Это означает, что если все ваши наборы имеют, скажем, 2 объекта, то все они имеют одинаковый хеш, и коллекция будет работать очень плохо.

person Ken    schedule 02.02.2010