question de addAnnotations (gestion de la mémoire peut-être?)

voix
1

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.

Créé 07/09/2009 à 17:31
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
5

Je suis tombé sur le même problème ou bug, et a trouvé une solution sur un billet de blog .

Vous pouvez voir si ce que vous voyez est le même que la question dans le poste en regardant la trace de la pile de débogage.

La question est due au fait que le MapViewController (parent du MKMapView) a été dealloc'd et la carte async aller chercher entrailles de MKMapView tente d'appeler le délégué de MKMapView (qui était MapViewController).

Ainsi, sur dealloc de MapViewController, vous devez réinitialiser le MKMapView.delegate = nul de sorte qu'aucun des délégués sont appelés après quelques tuiles se sont retournés.

MISE À JOUR: il est une bonne pratique (il est quelque part dans la gestion de la mémoire docs) aux délégués nul dans dealloc avant de libérer le porte-délégué. Cela arrêtera des problèmes comme cela se passe pour l'exécution de longues tâches async.

Créé 07/09/2009 à 17:35
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more