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];
 }
}
4

2 に答える 2

5

繰り返し処理している配列を変更しないでください。そうするつもりなら、そのコピーを反復処理する必要があります。

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

(ARCあり、ARC[[array copy] autorelease]なし)

必要に応じて、アイテムを操作する前に、アイテムがまだ可変配列にあるかどうかを確認できます。

于 2012-06-27T16:46:47.620 に答える
0

または、元の可変配列を反復処理しながら、削除する必要があるオブジェクトの新しい NSMutableArray を構築し、ループが完了した後に呼び出すこともできます。

[originalMutableArray removeObjects:newArrayContainingObjectsNeedingToBeRemoved];
于 2012-06-27T16:58:50.803 に答える