1

NSSetas key inを使用することのマイナス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
4

2 に答える 2

4

キーは Cocoa コンテナにコピーされていると思いますが、NSSet が辞書にコピーされるということですか? または、この場合に NSSet を保持する最適化はありますか?

NSDictionaries はキーをコピーします。

イミュータブルなセットはおそらくcopyそれ自体を保持することで応答し、「コピー」を実質的に無料にします。

変更可能なセットはcopy、それ自体のコピーを返すことで応答します。これが、変更可能なオブジェクトをキーとして使用することが一般的に悪い考えである理由です (変更後に元のオブジェクトを見つけることができなくなります。辞書)。

于 2009-12-08T06:01:38.970 に答える
3

ああ。はい。大きなパフォーマンスの欠点があります。-[NSSet hash]として実装されていることが起こり[set count]ます。つまり、すべてのセットに 2 つのオブジェクトがある場合、それらはすべて同じハッシュを持ち、コレクションのパフォーマンスが非常に低下します。

于 2010-02-02T05:56:42.593 に答える