2012-06-27 23 views
0

我得到的錯誤是突變陣列,同時列舉

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

我從NSGenericException明白的是,我去除我的數組的東西,而它被枚舉。仍然知道並環顧四周我似乎無法解決我的問題。這是下面的代碼。

-(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 ...)'循環中。你做不到。 – 2012-06-27 16:34:57

+1

你能提供更多關於這段代碼執行的地方嗎?被突變的數組是一個CALayerArray,它暗示了我對某些UI的更新;除了tableView重載之外,我沒有看到任何內容。這段代碼在哪裏發生? –

+0

這段代碼發生在我的' - (void)tableView(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath' – BigT

回答

5

您不應該修改您正在迭代的數組。如果你打算這樣做,你應該遍歷它的副本:(。有沒有ARC ARC [[array copy] autorelease]

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

如果需要,你可以檢查,如果該項目仍處於可變數組之前做任何事情。

0

或者,你可以建立的對象需要同時通過原來的可變數組迭代要刪除的一個新的NSMutableArray,然後循環完成後,調用

[originalMutableArray removeObjects:newArrayContainingObjectsNeedingToBeRemoved];