2011-12-07 4 views
0

Obj-C를 처음 사용하며 여기에 약간의 문제가 있습니다.obj-c의 콜렉션 참조

내가

NSMutableDictionary *myDict = [[NSMutableDictionary alloc] init]; 
NSMutableArray *myArray = [[NSMutableArray alloc] init]; 

[myDict setObject:[NSNumber numberWithInt:100] forKey:@"Record"]; 
[myDict setObject:@"www" forKey:@"Name"]; 
[myArray addObject:myDict]; 

[myDict setObject:[NSNumber numberWithInt:80] forKey:@"Record"]; 
[myDict setObject:@"eee" forKey:@"Name"]; 
[myArray addObject:myDict]; 

[myDict setObject:[NSNumber numberWithInt:70] forKey:@"Record"]; 
[myDict setObject:@"rrr" forKey:@"Name"]; 
[myArray addObject:myDict]; 

[myDict setObject:[NSNumber numberWithInt:0] forKey:@"Record"]; 
[myDict setObject:@"ttt" forKey:@"Name"]; 
[myArray addObject:myDict]; 

NSLog(@"myArray %@",myArray); 

에 관계없이 여기 나쁜 구현 코드의 배열에 임시 사전에서 값을 삽입하려고 해요 (뿐만 아니라 내 나쁜 영어 : p가) 나는 그림에 노력하고있어 각 삽입 후 myArraymyDict을 어떻게 청소합니까?

addObject 다음에 [myDict removeAllObjects];을 사용하면 끝에 빈 배열이 표시됩니다.

감사합니다.

모든 답변을 주셔서 감사합니다. [myArray addObject:[[myDict copy] autorelease]];으로 코드가 올바르게 작동합니다.

답변

4

여기서 문제는 정확히 동일한 변경 가능한 사전을 배열에 계속 추가하는 것입니다. 따라서 배열은 정확히 동일한 객체에 대한 참조 집합입니다. 따라서 배열의 모든 객체가 마지막 객체와 동일하다는 것은 놀라운 일이 아닙니다.

원하는대로하려면 두 가지 옵션이 있습니다. 첫 번째는 변경 가능한 사전을 매번 복사하고 해당 복사본을 배열에 추가하는 것입니다.

[myArray addObject:[[myDict copy] autorelease]]; 

다른 해결책은 별도의 사전을 사용하여 시작하는 것입니다. 대신 변경 가능한 사전 매번 돌연변이, 당신은 새로운있는 NSDictionary를 만들 수 있습니다 :

[myArray addObject:[NSDictionary dictionaryWithObjectsAndKeys: 
        [NSNumber numberWithInt:100], @"Record", 
        @"www", @"Name", 
        nil]]; 

[myArray addObject:[NSDictionary dictionaryWithObjectsAndKeys: 
        [NSNumber numberWithInt:80], @"Record", 
        @"eee", @"Name", 
        nil]]; 
+0

덕분에, 어떤 대답은 여기에 성능면에서 더 나은 방법이 될 것인가? 또는 낮은 수준의 코드 (화면에 아무 것도 그리지 않는다는 것을 의미) 이후 성능에 문제가 있어서는 안됩니다. – Ivan

+0

@Ivan : 한 번의 호출로 사전을 구성 할 수 있다면 그렇게해야합니다. –

2

나는

[myArray addObject:[[myDict copy] autorelease]]; 

는 그럼 당신은 정상으로 [myDict removeAllObjects]을 사용할 수 있습니다 ... 당신이 배열에 추가하기 전에 사전을 복사 할 필요가 있다고 생각합니다.

0

NSMutableDictionary * 제안 *으로하는 사전의 개체에 대한 포인터입니다. 그래서 배열에 추가하면 배열의 요소뿐만 아니라 myDict이 가리키는 것과 여전히 같은 객체입니다. 따라서, 나는 각각 추가 한 후에는 새 사전을 만들 제안 :

NSMutableDictionary *myDict = [[NSMutableDictionary alloc] init]; 
NSMutableArray *myArray = [[NSMutableArray alloc] init]; 

[myDict setObject:[NSNumber numberWithInt:100] forKey:@"Record"]; 
[myDict setObject:@"www" forKey:@"Name"]; 
[myArray addObject:myDict]; 

myDict = [[NSMutableDictionary alloc] init]; 

[myDict setObject:[NSNumber numberWithInt:80] forKey:@"Record"]; 
[myDict setObject:@"eee" forKey:@"Name"]; 
[myArray addObject:myDict]; 

난 당신이 위의 코드에서 ARC를 사용하는 가정합니다. 더 많은 목표 - C'ish 방법을 수행하는 것입니다,하지만

가 : 대답에 대한

[myArray addObject: [NSDictionary dictionaryForObjectsAndKeys: [NSNumber numberWithInt:80], @"Record", @"www", @"Name"]]; 
+0

내가 틀렸어? -1 의견이 없습니까? – Krizz