2009-12-08 3 views
1

키를 NSMutableDictionary의 키로 사용하는 것이 단점입니까, 어떤 거대한 성능상의 히트가 있습니까?코코아 : NSMutableDictionary에서 NSSet을 키로 사용할 때의 단점은 무엇입니까?

키가 코코아 컨테이너에 복사 된 것 같습니다. NSSet이 사전에 복사되었다는 의미입니까? 아니면이 경우에 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); 

출력 : Can a NSDictionary take in NSSet as key?

예제 코드에 관련

내가 키가 코코아 용기에 복사됩니다 생각

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

, 그것은 NSSet가 사전에 복사됩니다 의미합니까? 아니면이 경우에 NSSet을 유지하는 최적화가 있습니까?

NS 사전은 키를 복사합니다.

불변의 세트는 아마도 자신을 되 돌리는 것으로 copy에 응답 할 것이기 때문에 "복사"는 실질적으로 무료가됩니다.

변경 가능한 세트는 자신의 복사본을 반환함으로써 copy에 응답하므로 변경 가능한 개체를 키로 사용하는 것이 일반적으로 바람직하지 않습니다 (더 이상 비교하지 않기 때문에 원본을 변경할 수 없습니다. 사전의 키와 동일).

+0

+1, 나는 단지 불변의 인스턴스를 고려하고있다. 나는 변경 가능한 키를 갖는 것이 문제가 될 것이라고 생각한다. – stefanB

3

우. 예. 큰 실적 단점이 있습니다. -[NSSet hash][set count]으로 구현됩니다. 즉, 모든 세트에 2 개의 오브젝트가 있으면 말하면 모두 해시가 같아서 콜렉션이 거의 제대로 수행되지 않습니다.

관련 문제