2012-06-27 3 views
0

내가 점점 오전 오류가 내가 NSGenericException에서 이해하는 것이 열거하는 동안 내 배열에서 뭔가를 제거하고 있다는 점이다변이 된 배열 동안 열거되고

Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <CALayerArray: 0x7c85080> was mutated while being enumerated.' 

입니다. 아직도 그것을 알고 주위를 둘러 보니 내 문제를 해결할 수없는 것 같습니다. 아래 코드는 다음과 같습니다.

-(void)tableView(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 
    //Checks if message has been read. If message has not it updates the unreadMessages array 
    if ([unreadMessage containsObject:[NSString stringWithFormat:@"m%@",[[storage_array objectAtIndex:indexPath.row] objectForKey:@"id"]]] == TRUE && [[[storage_array objectAtIndex:indexPath.row] objectForKey:@"itemtype"] isEqualToString:@"message"] == TRUE){ 

    //Unread 
    [unreadMessage removeObject:[NSString stringWithFormat:@"m%@",[[storage_array objectAtIndex:indexPath.row] objectForKey:@"id"]]]; 
    [unreadMessage writeToFile:[self saveUnreadMessages] atomically:YES]; 
    //Read 
    [readMessage addObject:[NSString stringWithFormat:@"m%@",[[storage_array objectAtIndex:indexPath.row] objectForKey:@"id"]]]; 
    [readMessage writeToFile:[self saveReadMessages] atomically:YES]; 
    [tableView reloadData]; 
} 
else if ([unreadNewsletter containsObject:[NSString stringWithFormat:@"n%@",[[storage_array objectAtIndex:indexPath.row] objectForKey:@"id"]]] == TRUE && [[[storage_array objectAtIndex:indexPath.row] objectForKey:@"itemtype"] isEqualToString:@"newsletter"] == TRUE){ 

    //Unread 
    [unreadNewsletter removeObject:[NSString stringWithFormat:@"n%@",[[storage_array objectAtIndex:indexPath.row] objectForKey:@"id"]]]; 
    [unreadNewsletter writeToFile:[self saveUnreadNewsletters] atomically:YES]; 
    //Read 
    [readNewsletter addObject:[NSString stringWithFormat:@"n%@",[[storage_array objectAtIndex:indexPath.row] objectForKey:@"id"]]]; 
    [readNewsletter writeToFile:[self saveReadNewsletters] atomically:YES]; 
    [tableView reloadData]; 
} 
} 
+0

전화 그것은 for (... in ...) 루프에 있습니다. 너는 그것을 할 수 없다. –

+1

이 코드가 실행되는 위치에 대한 추가 컨텍스트를 제공 할 수 있습니까? 변형 된 배열은 CALayerArray이며 일부 UI 업데이트에 대해 알려줍니다. 그리고 tableView reload를 제외하고는 아무 것도 볼 수 없습니다. 이 코드는 어디에서 발생합니까? –

+0

이 코드는 내'- (void) tableView (UITableView *)에서 발생합니다. tableView didSelectRowAtIndexPath : (NSIndexPath *) indexPath' – BigT

답변

5

반복하는 배열을 수정하면 안됩니다. 당신이 의도 그렇게 할 경우, 당신은 그것의 복사본을 반복해야합니다 (..와 ARC [[array copy] autorelease] ARC없이)

for (id item in [array copy]) 
{ 
    … 
} 

를 필요한 경우 항목이 변경 가능하면 계속

, 당신은 확인하실 수 있습니다 배열로 무엇이든하기 전에.

0

양자 택일로, 당신은 원래의 가변 배열을 반복하면서 제거 할 필요가 오브젝트의 새로운있는 NSMutableArray을 만들 수 루프를 완료 한 후 다음, 나는 당신이하고있는 확신

[originalMutableArray removeObjects:newArrayContainingObjectsNeedingToBeRemoved]; 
관련 문제