Je rencontre des problèmes avec un singleton que j'ai créé. Il contient deux NSMutableDictionary, qui sont lus et utilisés dans trois vues (et quelques vues modales) dans toute l'application.Définition du dictionnaire dans singleton provoquant EXC_BAD_ACCESS
J'ai ajouté un MKMapView t tracer certains des lieux dans les dictionnaires sur une carte. Lorsque j'utilise exactement la même méthode/fonction utilisée dans toutes les autres vues pour accéder aux données, je reçois une erreur EXC_BAD_ACCESS relative à un dictionnaire désalloué. Cela vient de NSZombieEnabled:
CFDictionary retain: message sent to deallocated instance
Dans une trace dsym'ed, il est le remplacement d'un dictionnaire avec un autre qui cause la douleur. Le code que je utilise pour appeler la fonction provient d'un clic de MKAnnotationView:
UIControl *tempButton = sender;
NSString *selectedEventsString = [self.eventsArray objectAtIndex:tempButton.tag];
NSLog(@"eventString: %@", selectedEventsString);
[[EventsManager eventsManager] changeSelectedEventsDictionaryTo:selectedEventsString];
[tempButton release];
[selectedEventsString release];
« selectedEventsString » sort à un événement parfaitement correspondant.
Le code correspondant à SELM:
-(void)changeSelectedEventsDictionaryTo:(NSString *)eventName {
NSLog(@"singleton: %@", eventName);
self.eventString = eventName;
self.selectedEventsDictionary = [self.eventsDictionary objectForKey:eventName];
}
deux selectedEventsDictionary et eventsDictionary sont définis comme @property (nonatomic, conserver) dans le fichier .H, ce qui est la fonction d'initialisation:
+ (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;
}
Ceci est un exemple de code utilisé dans d'autres vues qui fonctionne très bien:
- (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
}
Toute aide serait grandement appréciée! Je pense que j'ai fourni tout le code pertinent, mais laissez-moi savoir si plus est nécessaire.
À la votre!
Ok, juste résolu. Mais c'était vraiment bizarre. À un moment donné, je stockais un NSString supplémentaire dans MKAnnotationView pour afficher des données personnalisées. J'ai arrêté de l'utiliser, mais la variable était toujours déclarée dans le fichier .H. Quand je l'ai enlevé, tout est tombé en place. Étrange erreur étrange. – gamblor87