прекращение вызова после выброса экземпляра 'NSException' - PullRequest
0 голосов
/ 05 мая 2011

я пытаюсь запустить свое приложение, но у меня возникло исключение, в консоли я получил это:

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) 

Я заметил, что получил это, так как я пытаюсь использовать аннотации для моего вида карты, помогите пожалуйста, спасибо заранее:)

EDIT

это мой цикл for, который может создавать проблемы:

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

1 Ответ

1 голос
/ 05 мая 2011

Причиной вашего исключения является "Коллекция ... была видоизменена при перечислении". Это означает, что вы пытались изменить массив в цикле for( in ), что недопустимо, поскольку это приведет к изменению объектов, которые вы должны перечислять. Конец причины - дамп массива, который вы перечислили. Содержит 7 MyLocation объектов. Если вы посмотрите на вершину стека вызовов, то увидите, что исключение произошло в вашем методе -[StationsSurLaCarteViewController requestFinished:]. Если вы посмотрите на этот метод и найдете место, где вы используете быстрое перечисление, вы легко найдете свою проблему.

Если вы хотите изменить массив при использовании быстрого перечисления, есть две возможности: отслеживать все вещи, которые вы хотите изменить (например, список индексов для удаления) и вносить изменения после цикла, или делать перечисление по копии массива. Вот пример второго метода:

NSArray *copiedArray = [originalArray copy];
for(id theObject in copiedArray) {
    if([theObject shouldBeDeleted]) {
        [originalArray removeObject:theObject];
    }
}
[copiedArray release];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...