addAnnotations issue (¿administración de memoria tal vez?)

votos
1

Tengo un problema con MKMapView / annotations / UINavigationController. Básicamente, administro mis vistas usando un UINavigationController; una de mis vistas contiene una MKMapView y agrego anotaciones en ella (de 10 a 200) usando el método addAnnotations.

Todo funciona bien, excepto por una cosa: si navego demasiado rápido en mi UINavigationController, el simulador de iphone se bloquea y recibe una señal de EXC BAD ACCESS. Por ejemplo, si cargo mi vista que contiene MKMapView e inmediatamente presiono el botón Atrás desde la barra de navegación UINavigationController, obtengo la señal. Pensé que el problema era con el método addAnnotations: cuando mi MKMapView está cargado, le agrego anotaciones, pero parece que todo se hace de forma asíncrona. Si espero un segundo antes de presionar el botón Atrás, no obtengo ningún error, pero si soy demasiado rápido, se bloquea. No obtengo ningún error si elimino la línea addAnnotations. Supongo que es porque el UINavigationController lanzó mi vista ANTES de que el método addAnnotations hiciera el trabajo.

¿Alguna buena solución para esto? No quiero que el usuario espere (mostrando una vista de carga, por ejemplo); Supongo que la solución podría ser una mejor gestión de la memoria, pero no veo cómo podría hacer esto.

    if(DEBUG_MODE) { NSLog(@Creating array of placemarks : begin); }
self.placemarkCache = [[NSMutableArray alloc] init];
// Loading placemarks for a placemark dictionary
NSArray *sortedKeys = [[self.placemarkDictionary allKeys] sortedArrayUsingSelector:@selector(compare:)];
for (id key in sortedKeys) {
    MyPlacemark *currentPlacemark = [self.placemarkDictionary objectForKey:key];
    [self.placemarkCache addObject:currentPlacemark];
    [currentPlacemark release];
}
if(DEBUG_MODE) { NSLog(@Creating array of placemarks : done); }
if(DEBUG_MODE) { NSLog(@Adding placemarks : begin); }
[self.mapView addAnnotations:self.placemarkCache];
if(DEBUG_MODE) { NSLog(@Adding placemarks : done); }

En este ejemplo, aparece el mensaje Agregar marcas de posición: hecho antes de mostrar nada en el mapa.

Publicado el 07/09/2009 a las 17:31
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
5

Me encontré con el mismo problema o error, y encontré una solución en una publicación de blog .

Puede ver si lo que está viendo es lo mismo que el problema en la publicación al observar el seguimiento de la pila del depurador.

El problema se debe al hecho de que MapViewController (el padre de MKMapView) ha sido desasignado y el mapa asincrónico de captación interna de MKMapView está intentando llamar al delegado de MKMapView (que era MapViewController).

Por lo tanto, en el desglose de MapViewController, debe restablecer MKMapView.delegate = nil para que no se llame a los delegados después de que se devuelvan algunos recuadros.

ACTUALIZACIÓN: es una buena práctica (está en algún lugar de los documentos de administración de memoria) anular delegados en dealloc antes de liberar al titular delegado. Esto evitará que problemas como este sucedan durante largas tareas asincrónicas.

Respondida el 07/09/2009 a las 17:35
fuente por usuario

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