2010-03-25 4 views
7

J'ai un bug où mon application a planté "EXC_BAD_ACCESS" quand j'ai appuyé sur la touche back de ma barre de navigation et la vue déchargée qui avait un MapKit (mapView) et utilisé le gestionnaire de position. J'ai essayé pendant des jours pour corriger le bug et est finalement arrivé à une solution pour toute personne qui vient à travers ce problème:MapKit/Location Manager bloque l'application lors du déchargement

Ajouter ce code à votre dealloc

- (void)dealloc { 
    mapView.delegate = nil; 
    locationManager.delegate = nil; 

    [mapView release]; 
    [locationManager release]; 
} 
+0

Merci, mec! La chose étrange est que vous ne pouvez pas le reproduire dans le simulateur. –

+0

Veuillez fournir plus de détails sur la mise en œuvre. Cela ressemble à un obj. est déjà sorti. Btw, c'est une bonne habitude de nil le délégué en dealloc. – kompozer

+0

Sans voir les journaux de plantage ne peut pas vraiment le dire. Mais on dirait que vous libérez quelque chose deux fois. essayez d'ajouter NSZombieEnabled, cela vous dira si vous essayez d'accéder à quelque chose en mémoire qui a déjà été libéré. – CW0007007

Répondre

0

j'avais celui-ci aussi, :) Et oui , cette correction est en fait une solution correcte;

- (void)dealloc { 
    mapView.delegate = nil; 
    locationManager.delegate = nil; 

    [mapView release]; 
    [locationManager release]; 
} 

Qu'est-ce qui se passe dans les coulisses est la suivante:

  1. Vous frappez la touche Back. Ceci décharge et par conséquent libère le contrôleur qui contient mapView. Comme il n'y a probablement eu qu'une seule référence au contrôleur, il sera alors libéré.

  2. Le gestionnaire de localisation, cependant, est probablement encore référencé quelque part dans les rouages ​​de la géolocalisation.

  3. Si locationManager et/ou mapView envoient maintenant une notification à leur délégué respectif, ils suivent un pointeur non valide. Ce qui entraînera une exception EXC_BAD_ACCESS.

Oui: il est toujours bon de demander aux délégués de se concentrer sur eux-mêmes. Je viens de souhaiter qu'Apple ajoute un peu d'automagique là-bas.

Questions connexes