iphone reverse-geocoding mkannotationview

iphone - Desasignación mientras los observadores de valor clave todavía están registrados(geocodificador inverso)



reverse-geocoding mkannotationview (2)

Cuando mi vista se va me sale el siguiente mensaje:

An instance 0x1c11e0 of class MKAnnotationView was deallocated while key value observers were still registered with it. Observation info was leaked, and may even become mistakenly attached to some other object. Set a breakpoint on NSKVODeallocateBreak to stop here in the debugger. Here''s the current observation info:

(Contexto: 0x0, Propiedad: 0x1e98d0>)

El código que define e inicia la geocodificación inversa es:

geo=[[MKReverseGeocoder alloc] initWithCoordinate:droppedAt]; geo.delegate=self; [geo start];

He intentado configurar geo.delegate a nil justo antes de que rechacé la vista. Eso sería demasiado fácil. También he intentado:

for (id <MKAnnotation> annotation in mvMap.annotations) { [[mvMap viewForAnnotation:annotation] removeObserver:self forKeyPath:@"selected"]; }

Lo que arroja un error que dice:

* Finalización de la aplicación debido a la excepción no detectada ''NSRangeException'', razón: ''No se puede eliminar un observador para la ruta de acceso "seleccionada" porque no está registrada como observador.

Mi punto de vista para el código de anotación es:

-(MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation { MKAnnotationView *aView; aView=(MKAnnotationView *) [mapView dequeueReusableAnnotationViewWithIdentifier:annotation.title]; if (aView==nil) aView=[[[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:annotation.title] autorelease]; else aView.annotation=annotation; [aView setImage:[UIImage imageNamed:selIcon]]; aView.canShowCallout=TRUE; aView.draggable=YES; return aView; }

Estoy presionando botones y girando los interruptores aquí mientras doy vuelta. ¿Alguna idea de lo que puedo hacer aquí?


Puede tener varios problemas, aquí. Para cada delegado que configure, debe borrarlo en dealloc. Para cada observador que configures, debes aclarar que, lo mismo con las notificaciones, etc.

Por lo tanto, su Dealloc debería tener (escrito en el navegador web, es posible que tenga que ajustar):

- (void) dealloc { [[NSNotificationCenter defaultCenter] removeObserver: self]; for (id <MKAnnotation> annotation in mvMap.annotations) { // remove all observers, delegates and other outward pointers. [[mvMap viewForAnnotation:annotation] removeObserver: self forKeyPath: path]; } gel.delegate = nil; // etc., your other stuff [super dealloc]; // Only in non-ARC legacy code. Modern stuff skips this. }

Revise su configuración (probablemente en viewDidLoad) y asegúrese de deshacer todo lo que hizo allí. Específicamente cualquier cosa que active una devolución de llamada.


Tengo los mismos problemas con los pines arrastrables. He encontrado que el siguiente código los resuelve:

(void)mapView:(MKMapView *)theMapView annotationView:(MKAnnotationView *)annotationView didChangeDragState:(MKAnnotationViewDragState)newState fromOldState:(MKAnnotationViewDragState)oldState { if (newState == MKAnnotationViewDragStateStarting) { // some my code } else if (newState == MKAnnotationViewDragStateCanceling) { [annotationView removeObserver:theMapView forKeyPath:@"dragState"]; } else if (newState == MKAnnotationViewDragStateEnding) { [annotationView removeObserver:theMapView forKeyPath:@"dragState"]; } }