2011-01-19 8 views
2

私のコードが次のようなときに "コレクションが突然列挙されました:未知の例外 'NSGenericException'の理由でアプリケーションを終了する: '***コレクション<__ NSArrayM:0x117540>が列挙されているときに突然変異しました

NSString *poiStr = nil; 
    int SuccessValue=0; 
    NSMutableArray* poisArray=[[NSMutableArray alloc]init]; 
    for (id<MKAnnotation> annotation in mainMapView.annotations) 
    { 
     MKAnnotationView* anView = [mainMapView viewForAnnotation: annotation]; 
     if(anView) 
     { 

      POI* locationPOI = (POI*)[anView annotation]; 
      printf("\n Location poi shape groupId:%s=====%s",[locationPOI.shapeSpaceGroupId UTF8String],[poiStr UTF8String]); 
      if((poiStr == nil) || ([poiStr isEqualToString:locationPOI.shapeSpaceGroupId])) 
      { 

       poiStr = locationPOI.shapeSpaceGroupId; 
       [poisArray addObject:locationPOI]; 
       SuccessValue++; 
      } 
      printf("\n successValue:%d",SuccessValue); 
      if(SuccessValue==2) 
      { 
       POI* poi=[poisArray objectAtIndex:0]; 
       [mainMapView removeAnnotation:poi]; 
       SuccessValue--; 
      } 

     }  

    } 

誰でも、コードの問題とその解決方法を教えてください。

ありがとうございました。 Madan。

+2

反復しながら、あなたがmodyfingています。そんなことはできない。コメントアウト[mainMapView removeAnnotation:poi];まだ例外がスローされているかどうかを確認してください –

+2

@カミルは答えとして投稿してください。 –

+0

@ Kamil:[mainMapView removeAnnotation:poi]という行をコメントアウトすると、例外は生成されませんが、私は古い感情を取り除き、新しいものを使用する必要があります。 –

答えて

11

基本的に、反復処理中のループのリストを変更しています。問題の原因となっている行は、mainMapView.annotationsを反復しているので、問題の原因となる行は次のとおりです。

[mainMapView removeAnnotation:poi]; 

考えられる解決策は、削除する要素を別のリストに累積し、ループの後に削除することです。あなたのコードに基づいて

、可能な解決策は、次のようになります。

 NSString *poiStr = nil; 
    int SuccessValue=0; 
    NSMutableArray* poisArray=[[NSMutableArray alloc]init]; 
    NSMutableArray *to_delete = [[NSMutableArray alloc] init]; 
    for (id<MKAnnotation> annotation in mainMapView.annotations) 
    { 
     MKAnnotationView* anView = [mainMapView viewForAnnotation: annotation]; 
     if(anView) 
     { 

      POI* locationPOI = (POI*)[anView annotation]; 
      printf("\n Location poi shape groupId:%s=====%s",[locationPOI.shapeSpaceGroupId UTF8String],[poiStr UTF8String]); 
      if((poiStr == nil) || ([poiStr isEqualToString:locationPOI.shapeSpaceGroupId])) 
      { 

       poiStr = locationPOI.shapeSpaceGroupId; 
       [poisArray addObject:locationPOI]; 
       SuccessValue++; 
      } 
      printf("\n successValue:%d",SuccessValue); 
      if(SuccessValue==2) 
      { 
       POI* poi=[poisArray objectAtIndex:0]; 
       //[mainMapView removeAnnotation:poi]; 
       [to_delete addObject:poi]; 
       SuccessValue--; 
      } 

     }  

    } 
    for (id<MKAnnotation> annotation in to_delete) 
      [mainMapView removeAnnotation:poi]; 

    [to_delete release]; 
+0

サンプルコードを説明してください。 –

+0

@Madan Mohan:手順は次のとおりです。1.ループの前に新しいNSMutableArrayを作成します。注釈を削除する代わりに、新しい可変配列に追加します。 3.ループが終了したら、新しい可変配列を繰り返して、その中にあるすべてのオブジェクトを注釈から削除します。 – JeremyP

+0

Thanq非常にあなたは本当に私の時間を節約しました。あなたの提案に従って、うまく動作します。 –

関連する問題