2013-04-08 1 views
2

NSMutableDictionary 값을 업데이트하는 데 이상한 문제가 있습니다. for-in 루프를 실행 중이며 모든 것이 정상적으로 검색되고 수학도 괜찮습니다.for-in 루프 내에서 NSMutableDictionary 값을 업데이트 할 수 없습니까?

setValue: forKey: 방법으로 사전을 업데이트하려고하면 문제가 발생합니다.

for(NSString *key in self.planetDictionary){ 
     if(![key isEqualToString:planet]){ 

      * * * 
      //do some math and stuff, create an NSNumber: 
      NSNumber *update = [NSNumber numberWithFloat:updatedProbability]; 

      //Problem code, EXC_BAD_ACCESS here: 
      [self.planetDictionary setValue:update forKey:key]; 
     } 
    } 

EXC_BAD_ACCESS 충돌이 발생합니다. 나는 그 밖의 모든 것이 괜찮다는 것을 확인할 수 있으며, 값을 업데이트하려고하는 곳은 단 한 줄이다.

무슨 일 이니? 감사합니다

+0

을 : 당신은 건물을 건설하고, 따라서 당신은 당신이 단순히 배열로 (키 복사)와 같은을 열거 할 수있는 모든 개체를 복사하고 싶지 않은) 많은 그리고 당신은 7 층에 있고, 4 층에 벽돌을 몇장 넣기로 결정했습니다. –

답변

7

빠른 열거 형 개체를 돌연변이시킬 수 없습니다. 매번 충돌 할 것입니다. 주위의 작품으로, 먼저 복사 할 수 있습니다 : 당신이 사전에 큰 개체가있는 경우, 또는

NSDictionary *dictionary = [self.planetDictionary copy]; 

for (NSString *key in dictionary) { 
    if (![key isEqualToString:planet]) {    
     NSNumber *update = [NSNumber numberWithFloat:updatedProbability]; 
     [self.planetDictionary setValue:update forKey:key]; 
    } 
} 

을 (즉, NSCopying을 준수, 그렇지 않으면 그냥 얕은 복사 될 것이며, 문제가 매우하지 않습니다 그것에 대해 생각

NSArray *keysCopy = [[self.planetDictionary allKeys] copy]; 

for (NSString *key in keysCopy) { 
    if (![key isEqualToString:planet]) { 
     NSNumber *update = [NSNumber numberWithFloat:updatedProbability]; 
     [self.planetDictionary setValue:update forKey:key]; 
    } 
} 
+0

자주 큰 값을 포함 할 수있는 전체 사전을 복사 할 필요가 없습니다. 키만 복사하면 충분합니다. – sixthcent

+0

@sixthcent, 아마도 가장 큰 차이점은 아니지만 가능성은 있습니다. 코드를 업데이트하겠습니다. –

2

열거하는 동안 그것을 돌연변이처럼 보이는군요.

NSDictionary를 반복하면서 변경할 수 없습니다.

루프 이전에 복사본을 만들고 원본을 변경하는 동안 복사본을 열거 할 수 있습니다.

2

for 루프에서 사용하는 동안 업데이트 할 수 없습니다. for 루프에서 사용하고 for 루프 내에서 원본을 업데이트하려면 사전 키 사본을 사용하십시오.

관련 문제