terminer appelé après avoir lancé une instance de 'NSException'
-
28-10-2019 - |
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];
}`
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];