2009-09-07 6 views
1

J'ai un problème avec MKMapView/annotations/UINavigationController. Fondamentalement, je gère mes vues en utilisant un UINavigationController; une de mes vues contient un MKMapView et j'y ajoute des annotations (10 à 200) en utilisant la méthode addAnnotations.problème addAnnotations (gestion de la mémoire peut-être?)

Tout fonctionne bien, sauf pour une chose: si je navigue "trop ​​vite" sur mon UINavigationController, le simulateur d'iphone plante, recevant un signal "EXC BAD ACCESS". Par exemple, si je charge ma vue contenant le MKMapView et que j'appuie immédiatement sur le bouton "Retour" de la barre de navigation de UINavigationController, j'obtiens le signal. J'ai pensé que le problème était avec la méthode addAnnotations: lorsque mon MKMapView est chargé, j'y ajoute des annotations mais tout semble se faire de manière asynchrone. Si j'attends comme une seconde avant d'appuyer sur le bouton "Retour", je n'obtiens aucune erreur mais si je suis trop rapide, il se bloque. Je ne reçois aucune erreur si je supprime la ligne addAnnotations. Je suppose que c'est parce que ma vue est publiée par le UINavigationController AVANT que la méthode addAnnotations ait fait le travail.

Toute bonne solution à cela? Je ne veux pas que l'utilisateur attende (affichage d'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. Dans cet exemple, j'obtiens le message "Ajout de repères: terminé" avant tout affichage sur la carte.

Répondre

5

J'ai rencontré le même problème ou problème et trouvé une solution sur un blog post.

Vous pouvez voir si ce que vous voyez est le même que le problème dans la publication en regardant la trace de la pile du débogueur. Le problème est dû au fait que MapViewController (le parent de MKMapView) a été libéré et que les composants internes de MKMapView qui tentent d'extraire la carte asynchrone tentent d'appeler le délégué de MKMapView (qui était MapViewController). Donc, sur dealloc de MapViewController, vous devez réinitialiser MKMapView.delegate = nil afin qu'aucun délégué ne soit appelé après que certaines tuiles soient retournées. MISE À JOUR: c'est une bonne pratique (c'est quelque part dans les documents de gestion de la mémoire) de nil délégués dans dealloc avant de libérer le titulaire du délégué. Cela empêchera de tels problèmes de se produire pour les tâches asynchrones de longue durée.

+0

C'est exactement le même problème et ça marche :) Cela semble évident maintenant ... Merci pour votre réponse! – Vivi

+1

Votre lien ne marche plus. – J2theC

Questions connexes