Cocoa:在NSMutableDictionary中使用NSSet作为键的任何缺点?

时间:2009-12-08 05:03:41

标签: objective-c cocoa nsdictionary nsmutabledictionary nsset

使用NSSet作为NSMutableDictionary中的关键字是否有任何缺点,任何需要注意的问题,任何巨大的性能命中?

我认为密钥是在Cocoa容器中复制的,是否意味着NSSet被复制到字典?或者是否存在一些在这种情况下保留NSSet的优化?

Can a NSDictionary take in NSSet as key?

相关

示例代码:

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

2 个答案:

答案 0 :(得分:4)

  

我认为密钥是在Cocoa容器中复制的,是否意味着NSSet被复制到字典?或者是否存在一些在这种情况下保留NSSet的优化?

NSDictionaries会复制他们的密钥。

不可变集可能会通过返回自身来回复copy,使“副本”几乎是免费的。

一个可变集将通过返回自身的副本来响应copy,这就是为什么使用可变对象作为键通常是一个坏主意(在变异之后你将无法找到它,因为它不再比较等于字典中的键。)

答案 1 :(得分:3)

哦。是。性能下降很大。 -[NSSet hash]实施为[set count]。这意味着,如果你的所有集合都有2个对象,那么它们都具有相同的散列,并且集合的执行效果非常差。