Hvorfor får jeg styrter etter MKMapView er frigjort hvis jeg ikke lenger bruker det?

stemmer
23

Jeg har en MKMapView. Noen ganger etter mitt syn kontrolleren er avvist, vil jeg få en EXC_BAD_ACCESS.

Jeg slått på NSSZombies, og det ser ut som det MKMapViewer delegat - mitt syn controller! - blir kalt, til tross for både MKMapViewog UIViewControllerunderklassen blir frigjort. Jeg har sjekket, og min minnehåndtering er riktig.

Hva skjer?

Publisert på 02/02/2010 klokken 22:10
kilden bruker
På andre språk...                            


4 svar

stemmer
43

Dette er på grunn av måten MKMapViewfungerer. Det er en operasjon som venter, så MapKit er beholdt MKMapView, og det har faktisk ikke blitt deallocated ennå. Det er ikke i seg selv et problem. Problemet er at det fortsatt sende meldinger til din delegat.

Løsningen er enkel: Som en del av visningen kontrolleren opprydding satt kartvisningen er delegat til nil, som vil hindre MKMapViewfra å sende meldinger til det.

Dette er dokumentert i MKMapViewDelegate Protocol Reference :

Før du slipper en MKMapView objekt som du har satt en delegat, må du huske å sette dette objektets delegat eiendom til null. Ett sted du kan gjøre dette er i dealloc metode der du kaster kartvisningen.

Edit: Gi Oscar en upvote også, like nedenfor, som leverte dokumentasjonen sitat her.

Gitt ARC, foreslår jeg at dette betyr at du bør sette inn kartvisning er delegat til nili ditt syn kontrolleren dealloc.

Svarte 02/02/2010 kl. 22:18
kilden bruker

stemmer
18

OK, er dette en bekreftelse på svaret. Det er fra Apple doc, men det mangler fra MKMapView. Det er bare funnet under dokumentasjon for sin delegat protokoll:

Før du slipper en MKMapView objekt som du har satt en delegat, må du huske å sette dette objektets delegat eiendom til null. Ett sted du kan gjøre dette er i dealloc metode der du kaster kartvisningen.

MERK: Dette gjelder også UIWebView.

Jeg satt MapView delegat pekeren til null i representantens dealloc metode, og våre krasjer synes å ha blitt eliminert.

Svarte 20/11/2011 kl. 21:20
kilden bruker

stemmer
2

Sette kartvisningen er delegat til nilikke fungerte for meg. Men å sette showsUserLocation=NOpå representanten arbeidet ved å sørge for noen posisjonsoppdateringer er mottatt.

Svarte 02/09/2011 kl. 16:57
kilden bruker

stemmer
0

Problemet, i mitt tilfelle, var det første gang jeg lanserte app jeg ikke trykk "tillate" når spørre for plassering autorisasjon (uhell !!).

Avinstallere app og re-installere det, når ledetekst jeg la fullmakter og ikke mer krasj!

Svarte 21/05/2015 kl. 15:11
kilden bruker

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