Какао: Някакъв недостатък при използването на 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