Эй, ребята, я читаю из списка, составленного так:
Как видите, это лист, который содержит информацию аннотаций разных типов (C, Visitor). Я могу отображать каждый тип аннотации очень хорошо, но я пытаюсь перебрать все типы и сразу отобразить все аннотации в виде карты. Вот код:
NSLog(@"loadAnnotations");
NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"PermitData" ofType:@"plist"];
NSDictionary *rootOfPermitDataPlistDict = [[NSDictionary alloc] initWithContentsOfFile:plistPath];
// NSMutableDictionary *permitDict = [[NSMutableDictionary alloc] init];
if ([self title] == @"All Permits") {
for (id key in rootOfPermitDataPlistDict) {
NSLog(@"key:%@",key);
//[key retain];
NSMutableDictionary *permitDict = [NSDictionary dictionaryWithDictionary:[rootOfPermitDataPlistDict objectForKey:key]];
//[key release];
//array containing annotation information: latitude, longitude, title, subtitle(see PermitData.plist)
NSArray *annotationsArray = [[NSArray alloc] initWithArray:[permitDict objectForKey:@"annotations"]];
[permitDict release];
[rootOfPermitDataPlistDict release];
CLLocationCoordinate2D workingCoordinate;
NSDictionary *annotationContainerDict = [[NSDictionary alloc] init];
//loop through annotations array, creating parking annotations filled with the information found in the plist
for(annotationContainerDict in annotationsArray){
NSLog(@"%@",annotationContainerDict);
ParkingAnnotation *parkingAnnot = [[ParkingAnnotation alloc] init];
workingCoordinate.latitude = [[annotationContainerDict objectForKey:@"latitude"] doubleValue];
workingCoordinate.longitude = [[annotationContainerDict objectForKey:@"longitude"] doubleValue];
[parkingAnnot setCoordinate:workingCoordinate];
[parkingAnnot setTitle:[annotationContainerDict objectForKey:@"title"]];
[parkingAnnot setSubtitle:[annotationContainerDict objectForKey:@"subtitle"]];
if ([parkingAnnot title] == @"C Parking") [parkingAnnot setAnnotationType:annotationTypeC];
else if ([parkingAnnot title] == @"Visitor Parking") [parkingAnnot setAnnotationType:annotationTypeVisitor];
[mapView addAnnotation:parkingAnnot];
[parkingAnnot release];
}
[permitDict release];
}
}
И это вывод консоли при запуске программы:
2010-11-25 03:25:28.020 Parking[38918:207] All Permits
2010-11-25 03:25:28.021 Parking[38918:207] loadAnnotations
2010-11-25 03:25:28.021 Parking[38918:207] key:C
2010-11-25 03:25:28.021 Parking[38918:207] {
latitude = "38.545301";
longitude = "-121.754066";
subtitle = "VP 17";
title = "C Parking";
}
2010-11-25 03:25:28.022 Parking[38918:207] {
latitude = "38.544831";
longitude = "-121.754785";
subtitle = "VP 16";
title = "C Parking";
}
2010-11-25 03:25:28.022 Parking[38918:207] {
latitude = "38.544781";
longitude = "-121.755729";
subtitle = "VP 22";
title = "C Parking";
}
2010-11-25 03:25:28.022 Parking[38918:207] {
latitude = "38.544412";
longitude = "-121.752489";
subtitle = "VP 15";
title = "C Parking";
}
Таким образом, он корректно перебирает первый NSDictionary, но вылетает, когда собирается начать прохождение следующего. И я попытался изменить NSDictionary на NSMutableDictionary, но результат тот же. Поэтому, когда я выбираю строку «Все разрешения» в табличном представлении, она зависает на долю секунды (без переключения в представление карты), а затем вылетает, не генерируя ошибку.
Если кто-то не против помочь мне здесь, я был бы очень признателен. Заранее спасибо!
EDIT:
Вот трассировка стека (описанная в комментариях ниже):
2010-11-25 20:28:08.141 Parking[39400:207] All Permits
2010-11-25 20:28:08.142 Parking[39400:207] loadAnnotations
2010-11-25 20:28:08.142 Parking[39400:207] key:C
2010-11-25 20:28:08.143 Parking[39400:207] {
latitude = "38.545301";
longitude = "-121.754066";
subtitle = "VP 17";
title = "C Parking";
}
2010-11-25 20:28:08.143 Parking[39400:207] {
latitude = "38.544831";
longitude = "-121.754785";
subtitle = "VP 16";
title = "C Parking";
}
2010-11-25 20:28:08.143 Parking[39400:207] {
latitude = "38.544781";
longitude = "-121.755729";
subtitle = "VP 22";
title = "C Parking";
}
2010-11-25 20:28:08.144 Parking[39400:207] {
latitude = "38.544412";
longitude = "-121.752489";
subtitle = "VP 15";
title = "C Parking";
}
2010-11-25 20:28:08.145 Parking[39400:207] *** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSCFDictionary: 0x6d5fd80> was mutated while being enumerated.<CFBasicHash 0x6d5fd80 [0x2667380]>{type = mutable dict, count = 1,
entries =>
0 : <0x7380> = <NSKeyValueContainerClass: Original class: ParkingAnnotation, Notifying class: NSKVONotifying_ParkingAnnotation>
}
'
*** Call stack at first throw:
(
0 CoreFoundation 0x025fdb99 __exceptionPreprocess + 185
1 libobjc.A.dylib 0x0274d40e objc_exception_throw + 47
2 CoreFoundation 0x025fd659 __NSFastEnumerationMutationHandler + 377
3 Parking 0x00002e93 -[ParkingMapViewController loadAnnotations] + 364
4 Parking 0x00002caf -[ParkingMapViewController viewDidLoad] + 117
5 UIKit 0x0036a5ca -[UIViewController view] + 179
6 UIKit 0x003689f4 -[UIViewController contentScrollView] + 42
7 UIKit 0x003787e2 -[UINavigationController _computeAndApplyScrollContentInsetDeltaForViewController:] + 48
8 UIKit 0x00376ea3 -[UINavigationController _layoutViewController:] + 43
9 UIKit 0x00378067 -[UINavigationController _startTransition:fromViewController:toViewController:] + 326
10 UIKit 0x00372ccd -[UINavigationController _startDeferredTransitionIfNeeded] + 266
11 UIKit 0x00379d8b -[UINavigationController pushViewController:transition:forceImmediate:] + 876
12 UIKit 0x00372b67 -[UINavigationController pushViewController:animated:] + 62
13 Parking 0x00002914 -[PermitListViewController tableView:didSelectRowAtIndexPath:] + 307
14 UIKit 0x00333a48 -[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:] + 1140
15 UIKit 0x0032a32e -[UITableView _userSelectRowAtIndexPath:] + 219
16 Foundation 0x0003f21a __NSFireDelayedPerform + 441
17 CoreFoundation 0x025def73 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 19
18 CoreFoundation 0x025e05b4 __CFRunLoopDoTimer + 1364
19 CoreFoundation 0x0253cdd9 __CFRunLoopRun + 1817
20 CoreFoundation 0x0253c350 CFRunLoopRunSpecific + 208
21 CoreFoundation 0x0253c271 CFRunLoopRunInMode + 97
22 GraphicsServices 0x02edc00c GSEventRunModal + 217
23 GraphicsServices 0x02edc0d1 GSEventRun + 115
24 UIKit 0x002ceaf2 UIApplicationMain + 1160
25 Parking 0x00001e08 main + 102
26 Parking 0x00001d99 start + 53
)
terminate called after throwing an instance of 'NSException'
Однако я выпускаю allowDict в цикле for (второй [releaseDict release] был оставлен без комментариев), поэтому я не знаю, почему он жалуется на то, что NSDictionary является неизменным. Как вы можете видеть, allowDict имеет тип NSMutableDictionary, поэтому я не понимаю, почему он дает мне эту ошибку.