Je vais avoir un problème avec MKMapView / annotations / UINavigationController. Fondamentalement, je gère mes vues à l'aide d'un UINavigationController; un de mon avis contient une MKMapView et j'ajouter des annotations sur elle (10 à 200) en utilisant la méthode addAnnotations.
Tout fonctionne bien sauf pour une chose: si je navigue « trop vite » sur mon UINavigationController, les accidents de simulateur d'iPhone, recevant un signal « EXC ACCESS BAD ». Par exemple, si je charge mon point de vue contenant le MKMapView et appuyez sur le bouton immediat « Retour » dans la barre de navigation UINavigationController, je reçois le signal. Je me suis dit que le problème était avec la méthode addAnnotations: quand mon MKMapView est chargé, j'ajouter des annotations mais il semble que tout est fait de manière asynchrone. Si j'attends comme une seconde avant de pousser le bouton « Retour », je reçois pas d'erreur, mais si je suis trop vite, il se bloque. Je reçois pas d'erreur du tout si je supprime la ligne addAnnotations. Je suppose que c'est parce que mon avis est publié par le UINavigationController AVANT la méthode addAnnotations fait le travail.
Toute bonne solution à cela? Je ne veux pas l'utilisateur d'attendre (affichant une vue de chargement par exemple); Je suppose que la solution pourrait être une meilleure gestion de la mémoire, mais je ne vois pas comment je pourrais le faire.
if(DEBUG_MODE) { NSLog(@Creating array of placemarks : begin); }
self.placemarkCache = [[NSMutableArray alloc] init];
// Loading placemarks for a placemark dictionary
NSArray *sortedKeys = [[self.placemarkDictionary allKeys] sortedArrayUsingSelector:@selector(compare:)];
for (id key in sortedKeys) {
MyPlacemark *currentPlacemark = [self.placemarkDictionary objectForKey:key];
[self.placemarkCache addObject:currentPlacemark];
[currentPlacemark release];
}
if(DEBUG_MODE) { NSLog(@Creating array of placemarks : done); }
if(DEBUG_MODE) { NSLog(@Adding placemarks : begin); }
[self.mapView addAnnotations:self.placemarkCache];
if(DEBUG_MODE) { NSLog(@Adding placemarks : done); }
Sur cet exemple, je reçois le « Ajout placemarks: fait » un message avant tout s'afficher sur la carte.













