¿Por qué estoy chocando después MKMapView se libera si ya no lo estoy usando?

votos
23

Tengo una MKMapView. A veces después de mi controlador de vista es despedido, voy a conseguir unaEXC_BAD_ACCESS .

Encendí NSSZombiesy parece que la MKMapView's delegado - mi controlador de vista! - se está llamando, a pesar de tanto el MKMapViewy la UIViewControllersubclase de ser liberado. He comprobado, y mi gestión de memoria es correcta.

¿Que esta pasando?

Publicado el 02/02/2010 a las 23:10
fuente por usuario
En otros idiomas...                            


4 respuestas

votos
43

Esto es debido a la forma en que MKMapViewfunciona. Hay una operación pendiente, por lo MapKit está reteniendo el MKMapViewy que en realidad no se ha desasignado todavía. Eso no es un problema en sí. El problema es que todavía está enviando mensajes a su delegado.

La solución es simple: Como parte de la limpieza de su controlador de vista establece el delegado de la vista del mapa nil, lo que impedirá MKMapViewrecibir más mensajes a la misma.

Esto está documentado en MKMapViewDelegate Protocolo de Referencia :

Antes de liberar un objeto MKMapView para el que ha establecido un delegado, recuerde que debe establecer la propiedad de ese objeto delegado a cero. Un lugar que usted puede hacer esto es en el método dealloc donde se deshaga de la vista del mapa.

Editar: Dar un Oscar upvote así, justo por debajo, que proporcionó la documentación cita aquí.

Dada ARC, que sugiere esto significa que debe establecer el delegado de la vista de mapa para nilen su controlador de vista de dealloc.

Respondida el 02/02/2010 a las 23:18
fuente por usuario

votos
18

OK, esto es la confirmación de la respuesta. Es de la doc Apple, pero que le falta de MKMapView. Sólo ha encontrado en la documentación de su protocolo delegado:

Antes de liberar un objeto MKMapView para el que ha establecido un delegado, recuerde que debe establecer la propiedad de ese objeto delegado a cero. Un lugar que usted puede hacer esto es en el método dealloc donde se deshaga de la vista del mapa.

NOTA: Esto también se aplica a UIWebView.

Me puse puntero del delegado del MapView a cero en el método dealloc del delegado, y nuestros choques parece que han sido eliminados.

Respondida el 20/11/2011 a las 22:20
fuente por usuario

votos
2

Ajuste el delegado de la vista del mapa para nilno funcionó para mí. Sin embargo, el establecimiento showsUserLocation=NOde la delegada trabajó asegurándose de que no se reciben actualizaciones de ubicación.

Respondida el 02/09/2011 a las 17:57
fuente por usuario

votos
0

El problema, en mi caso, era la primera vez que puso en marcha aplicación que no presione "permitir" cuando se pida la autorización ubicación (por accidente !!).

Desinstalar la aplicación y volver a instalarla, cuando aparecen pronta dejo que las autorizaciones y no más de choque!

Respondida el 21/05/2015 a las 15:11
fuente por usuario

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