У меня проблемы с синглтоном, который я создал. Он содержит два NSMutableDictionary, которые читаются и используются в трех представлениях (и некоторых модальных представлениях) по всему приложению.
Я добавил MKMapView, чтобы отобразить некоторые места внутри словарей на карте. Когда я использую тот же метод / функцию, что и в любом другом представлении, для доступа к данным, я получаю ошибку EXC_BAD_ACCESS, относящуюся к освобожденному словарю. Это исходит от NSZombieEnabled:
CFDictionary retain: message sent to deallocated instance
По следам dsym'а, замена одного словаря другим вызывает горе. Код, который я использую для вызова функции, получен из щелчка MKAnnotationView:
UIControl *tempButton = sender;
NSString *selectedEventsString = [self.eventsArray objectAtIndex:tempButton.tag];
NSLog(@"eventString: %@", selectedEventsString);
[[EventsManager eventsManager] changeSelectedEventsDictionaryTo:selectedEventsString];
[tempButton release];
[selectedEventsString release];
«selectedEventsString» выходит на совершенно соответствующее событие.
Соответствующий код в EventsManager:
-(void)changeSelectedEventsDictionaryTo:(NSString *)eventName {
NSLog(@"singleton: %@", eventName);
self.eventString = eventName;
self.selectedEventsDictionary = [self.eventsDictionary objectForKey:eventName];
}
В файле .H и selectedEventsDictionary, и eventsDictionary установлены как @property (nonatomic, retain), и это функция init:
+ (EventsManager*)eventsManager {
if (eventsManager == nil) {
eventsManager = [[super allocWithZone:NULL] init];
eventsManager.eventsDictionary = [[NSMutableDictionary alloc] init];
eventsManager.selectedEventsDictionary = [[NSMutableDictionary alloc] init];
eventsManager.eventString = [[NSString alloc] init];
eventsManager.mode = [[NSString alloc] init];
}
return eventsManager;
}
Это пример кода, используемого в других представлениях, который работает нормально:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSUInteger row = [indexPath row];
NSString *eventString = [self.eventsArray objectAtIndex:row];
[[EventsManager eventsManager] changeSelectedEventsDictionaryTo:eventString];
//Modal display code here
}
Любая помощь будет принята с благодарностью! Я думаю, что предоставил весь соответствующий код, но дайте мне знать, если потребуется больше.
Ура!