2011-05-04 2 views
0

난 내 응용 프로그램을 실행하려고 노력하지만, 내가 가지고 콘솔에 던져 예외를 가지고이 :'NSException'

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) 

내가 가지고 것으로 나타났습니다 그 이후 내가 사전 :

편집에서 들으 도와 줘요 내지도보기 위해 주석을 사용하려고

이 문제를 만들 수있는 내 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

귀하의 예외에 대한 이유는 "컬렉션 ... 열거 된 동안 변형되었습니다"입니다. 이는 for(in) 루프 내에서 배열을 변경하려고 시도했음을 의미합니다. 열거하고있는 객체를 변경하기 때문에 허용되지 않습니다. 이유의 끝은 당신이 열거하고 있던 배열의 덤프입니다. 여기에는 7 개의 MyLocation 개체가 포함되어 있습니다. 호출 스택의 맨 위를 보면 -[StationsSurLaCarteViewController requestFinished:] 메서드에서 예외가 발생했음을 알 수 있습니다. 이 방법을 살펴보고 빠른 열거 형을 사용하는 곳을 찾으면 쉽게 문제를 찾아야합니다.

빠른 열거 형을 사용하는 동안 배열을 수정하려는 경우 두 가지 가능성이 있습니다. 변경하려는 모든 항목 (예 : 제거 할 색인 목록)을 추적하고 루프 이후에 변경하거나 배열의 복사본 위로 열거하십시오. 다음은 두 번째 방법의 예입니다.

NSArray *copiedArray = [originalArray copy]; 
for(id theObject in copiedArray) { 
    if([theObject shouldBeDeleted]) { 
     [originalArray removeObject:theObject]; 
    } 
} 
[copiedArray release]; 
+0

안녕하세요, 제 편집을 보시기 바랍니다. 'for'loop의 문제점을 볼 수 없지만, 메모리 관리가 누락 되었습니까? – Luca

+0

루프가 충돌을 일으키고 있습니까? 찾으려는 것은'for (in)'문법을 사용하고,'in' 다음에 명명 된 배열을 변경해야합니다. 그 루프가 문제라면 다른 스레드도 실행중인 또 다른 루프가 발생합니다. – ughoavgfhw