Question

J'essaye d'exécuter mon application, mais j'ai une exception lancée, dans la console j'ai ceci:

2011-05-05 00:18:50.984 myApp[2906:207] *** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSArrayM: 0x6b8b780> was mutated while being enumerated.(
    "<MyLocation: 0x6b67af0>",
    "<MyLocation: 0x6b19360>",
    "<MyLocation: 0x6b67a70>",
    "<MyLocation: 0x6b8d110>",
    "<MyLocation: 0x6b8d280>",
    "<MyLocation: 0x6b8ce50>",
    "<MyLocation: 0x6b8d660>"
)'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x02915919 __exceptionPreprocess + 185
    1   libobjc.A.dylib                     0x0272a5de objc_exception_throw + 47
    2   CoreFoundation                      0x029153d9 __NSFastEnumerationMutationHandler + 377
    3   myApp                          0x00005755 -[StationsSurLaCarteViewController requestFinished:] + 343
    4   myApp                          0x000195cb -[ASIHTTPRequest reportFinished] + 171
    5   Foundation                          0x000abe9a __NSThreadPerformPerform + 251
    6   CoreFoundation                      0x028f6d7f __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15
    7   CoreFoundation                      0x028552cb __CFRunLoopDoSources0 + 571
    8   CoreFoundation                      0x028547c6 __CFRunLoopRun + 470
    9   CoreFoundation                      0x02854280 CFRunLoopRunSpecific + 208
    10  CoreFoundation                      0x028541a1 CFRunLoopRunInMode + 97
    11  GraphicsServices                    0x02e8e2c8 GSEventRunModal + 217
    12  GraphicsServices                    0x02e8e38d GSEventRun + 115
    13  UIKit                               0x0033ab58 UIApplicationMain + 1160
    14  myApp                          0x0000224c main + 102
    15  myApp                          0x000021dd start + 53
)
terminate called after throwing an instance of 'NSException'
Program received signal:  “SIGABRT”.
(gdb) 

J'ai remarqué que j'ai compris cela depuis que j'essaye d'utiliser les annotations pour ma vue cartographique, aidez-moi s'il vous plaît, merci d'avance :)

voici ma boucle for qui peut poser des problèmes:

 for (int i=0; i<[array count]; i++) {

           NSDictionary *stationEnCours=[array objectAtIndex:i];


           NSString *distance=[stationEnCours objectForKey:@"distance"];
           float lng = [[stationEnCours objectForKey:@"ssiphone_longitude"]   floatValue];
           float lat = [[stationEnCours objectForKey:@"ssiphone_latitude"] floatValue];
           NSString *ensStation=[stationEnCours objectForKey:@"ssiphone_enseigne"];

           location2D = (CLLocationCoordinate2D){ .latitude = lat, .longitude = lng };
           MyLocation *annotation=[[[MyLocation alloc]initWithName:ensStation distanceVersLaStation:distance coordinate:location2D]autorelease];
           [mapView addAnnotation:annotation];
           MKCoordinateSpan span={latitudeDelta:0.2,longitudeDelta:0.2};
           MKCoordinateRegion region={location2D,span};
           [mapView setRegion:region];
           [self.view addSubview:mapView];
           }`
Était-ce utile?

La solution

La raison donnée pour votre exception est "Collection ... a été mutée lors de l'énumération".Cela signifie que vous avez essayé de modifier un tableau dans une boucle for( in ), ce qui n'est pas autorisé car cela modifierait les objets que vous êtes censé énumérer.La fin de la raison est un vidage du tableau que vous avez énuméré.Il contient 7 objets MyLocation.Si vous regardez en haut de la pile d'appels, vous voyez que l'exception s'est produite dans votre méthode -[StationsSurLaCarteViewController requestFinished:].Si vous regardez à travers cette méthode et trouvez un endroit où vous utilisez une énumération rapide, vous devriez facilement trouver votre problème.

Si vous souhaitez modifier un tableau tout en utilisant une énumération rapide, il y a deux possibilités: garder une trace de toutes les choses que vous voulez changer (c'est-à-dire une liste d'index à supprimer) et faire les changements après la boucle, ou fairel'énumération sur une copie du tableau.Voici un exemple de la deuxième méthode:

NSArray *copiedArray = [originalArray copy];
for(id theObject in copiedArray) {
    if([theObject shouldBeDeleted]) {
        [originalArray removeObject:theObject];
    }
}
[copiedArray release];
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top