2010-02-02 5 views
23

Tengo un MKMapView. A veces, después de que mi controlador de vista se descarta, obtendré un EXC_BAD_ACCESS.¿Por qué me cuelgo después de liberar MKMapView si ya no lo uso?

Encendí NSSZombies y parece el delegado MKMapView - ¡mi controlador de vista! - se está llamando, a pesar de que se liberaron las subclases MKMapView y UIViewController. Lo he verificado y mi administración de memoria es correcta.

¿Qué está pasando?

+2

+1 por ahorrar mi tiempo. – EmptyStack

Respuesta

43

Esto se debe a la forma en que funciona MKMapView. Hay una operación pendiente, por lo que MapKit retiene el MKMapView y aún no ha sido desasignado. Eso no es un problema en sí mismo. El problema es que todavía está enviando mensajes a su delegado.

La solución alternativa es simple: como parte de la limpieza de su controlador de vista configure el delegado de la vista de mapa en nil, lo que evitará que MKMapView le envíe mensajes.

Esto está documentado en MKMapViewDelegate Protocol Reference:

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

Editar: Dar Oscar un voto arriba, justo debajo, quien proporcionó la cita de documentación aquí.

Dado ARC, sugiero que esto signifique que debe configurar el delegado de su vista de mapa en nil en el controlador de vista dealloc.

+1

¡Muchas gracias por su ayuda! –

+2

Gracias.Mi pregunta es si se suponía que debíamos saber esto de alguna manera. Si esto se espera de los usuarios de MapView, entonces ¿por qué no tenemos que borrar el puntero de delegado de TODOS los controles que toman un delegado? – Oscar

+0

¡GRACIAS! Esto me salvó el día. –

2

Configurar el delegado de la vista de mapa en nil no funcionó para mí. Sin embargo, establecer showsUserLocation=NO en el delegado funcionó asegurándose de que no se reciban actualizaciones de ubicación.

+0

¿Tuviste la vista del mapa conectada? Supongo que fue nulo. –

18

Bien, esta es la confirmación de la respuesta. Es del documento de Apple, pero falta en MKMapView. Sólo ha encontrado en la documentación de su protocolo delegado:

Antes de lanzar 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 puede hacer es en el método dealloc donde se deshace de la vista del mapa.

NOTA: Esto también se aplica a UIWebView.

Configuré el puntero delegado de MapView en cero en el método dealloc del delegado, y parece que nuestros bloqueos se han eliminado.

+1

No sabía que Apple había documentado este comportamiento en ningún lado. Gracias; He agregado el enlace a mi respuesta (que también cubre el por qué). –

0

El problema, en mi caso, fue la primera vez que inicié la aplicación, no presiono "permitir" cuando solicito autorización de ubicación (¡accidentalmente!).

Desinstalar la aplicación y volver a instalarla, cuando aparezca el aviso ¡Permitiré las autorizaciones y no más bloqueos!

Cuestiones relacionadas