2010-02-02 3 views
23

Ich habe eine MKMapView. Manchmal, nachdem mein View-Controller entlassen wurde, erhalte ich eine EXC_BAD_ACCESS.Warum stürze ich ab, nachdem MKMapView freigegeben wurde, wenn ich es nicht mehr benutze?

Ich habe NSSZombies eingeschaltet und es sieht aus wie der Delegierte MKMapView - mein View-Controller! - wird aufgerufen, obwohl die beiden Unterklassen MKMapView und UIViewController freigegeben sind. Ich habe überprüft, und meine Speicherverwaltung ist korrekt.

Was ist los?

+2

+1 für das Speichern meiner Zeit. – EmptyStack

Antwort

43

Dies ist wegen der Art und Weise MKMapView funktioniert. Da ein Vorgang aussteht, behält MapKit den Wert MKMapView bei und es wurde noch nicht freigegeben. Das ist selbst kein Problem. Das Problem ist, dass es weiterhin Nachrichten an Ihren Delegaten sendet.

Die Problemumgehung ist einfach: Als Teil der Bereinigung Ihres Ansichtscontrollers setzen Sie den Delegaten der Kartenansicht auf nil, wodurch verhindert wird, dass MKMapView Nachrichten an sie sendet.

Dies ist in MKMapViewDelegate Protocol Reference dokumentiert:

ein MKMapView Objekt vor der Freigabe für die Sie einen Delegaten festgelegt haben, daran erinnert, dass Objekts der Delegierten-Eigenschaft auf Null zu setzen. Ein Ort, an dem Sie dies tun können, ist in der Dealloc-Methode, wo Sie die Kartenansicht entsorgen.

Edit: Geben Sie Oscar auch ein upvote, gerade unten, wer das Dokumentationsangebot hier zur Verfügung gestellt.

Angesichts ARC, ich schlage vor, bedeutet dies, dass Sie die Delegierten für die Kartenansicht auf nil in Ihrem View Controller dealloc setzen sollten.

+1

Vielen Dank für Ihre Hilfe! –

+2

Danke.Meine Frage ist, ob wir das irgendwie wissen sollten. Wenn dies von Benutzern von MapView erwartet wird, warum müssen wir dann nicht den Delegatzeiger ALLER Steuerelemente löschen, die einen Delegaten übernehmen? – Oscar

+0

DANKE! Das hat meinen Tag gerettet. –

2

Das Delegieren der Map-Ansicht auf nil zu setzen, funktionierte nicht für mich. Die Einstellung showsUserLocation=NO auf dem Delegaten funktioniert jedoch, indem sichergestellt wird, dass keine Standortaktualisierungen empfangen werden.

+0

Hatten Sie die Kartenansicht verbunden? Ich schätze, es war nichts. –

18

OK, dies ist die Bestätigung der Antwort. Es stammt aus dem Apple-Dokument, aber es fehlt in MKMapView. Es ist nur unter der Dokumentation für seinen Delegaten Protokoll gefunden:

Objekt

Vor Freigabe eines MKMapView für die Sie einen Delegierten festgelegt haben, daran erinnern, dass Objekt des Delegierten-Eigenschaft auf Null zu setzen. Eine Stelle, die Sie tun können, ist in der Dealloc-Methode, wo Sie die Kartenansicht entsorgen.

HINWEIS: Dies gilt auch für UIWebView.

Ich setze den Delegate-Zeiger des MapView auf Null in der Dealloc-Methode des Delegaten, und unsere Abstürze scheinen beseitigt worden zu sein.

+1

Mir war nicht bewusst, dass Apple dieses Verhalten irgendwo dokumentiert hatte. Vielen Dank; Ich habe den Link zu meiner Antwort hinzugefügt (die auch den Grund dafür enthält). –

0

Das Problem, in meinem Fall, war das erste Mal, als ich app startete ich nicht drücken "Erlauben" bei der Aufforderung zur Standortgenehmigung (versehentlich !!).

App deinstallieren und neu installieren, wenn die Eingabeaufforderung erscheint, erlaube ich die Berechtigungen und keinen Absturz mehr!

Verwandte Themen