iOS eliminando las superposiciones de MKMapView que no funcionan

Me gustaría eliminar todas las superposiciones de mi map en un punto, y probé diferentes forms, pero nunca funciona.

El último bash que hice [self.mapView removeOverlays:self.mapView.overlays]; y todavía no funciona. ¿Alguna idea de cómo puedo eliminar esas superposiciones?

Gracias.

ACTUALIZACIÓN 1

Tengo el error: malloc: *** error for object 0x5adc0c0: pointer being freed was not allocated *** set a breakpoint in malloc_error_break to debug

Creo que sé por qué, pero realmente no sé cómo solucionarlo … Aquí está el código cuando necesito dibujar otra línea en mi mapView:

 // Create ac array of points. MKMapPoint *pointsArray = malloc(sizeof(CLLocationCoordinate2D) * 2); // Create 2 points. MKMapPoint startPoint = MKMapPointForCoordinate(CLLocationCoordinate2DMake(oldLatitude, oldLongitude)); MKMapPoint endPoint = MKMapPointForCoordinate(CLLocationCoordinate2DMake(newLatitude, newLongitude)); // Fill the array. pointsArray[0] = startPoint; pointsArray[1] = endPoint; // Erase polyline and polyline view if not nil. if (self.routeLine != nil) { [_routeLine release]; self.routeLine = nil; } if (self.routeLineView != nil) { [_routeLineView release]; self.routeLineView = nil; } // Create the polyline based on the array of points. self.routeLine = [MKPolyline polylineWithPoints:pointsArray count:2]; // Add overlay to map. [self.mapView addOverlay:self.routeLine]; // clear the memory allocated earlier for the points. free(pointsArray); // Save old coordinates. oldLatitude = newLatitude; oldLongitude = newLongitude; 

Así que libero el object routeLine que es la superposition previa. Entonces, cuando traté de eliminarlo, se bloquea porque ya se ha desasignado.

Aquí está el código para el delegado de mapView para agregar vistas de superposition:

 - (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay { MKOverlayView* overlayView = nil; if(overlay == _routeLine) { // If we have not yet created an overlay view for this overlay, create it now. if(self.routeLineView == nil) { self.routeLineView = [[[MKPolylineView alloc] initWithPolyline:_routeLine] autorelease]; self.routeLineView.fillColor = [UIColor blueColor]; self.routeLineView.strokeColor = [UIColor blueColor]; // Size of the trace. self.routeLineView.lineWidth = routeLineWidth; } overlayView = self.routeLineView; } return overlayView; } 

Si ustedes saben cómo puedo solucionar este problema, eliminar todas las superposiciones de mi MKMapView sería increíble.

ACTUALIZACIÓN 2

Intenté no liberar mis objects routeLine y routeLineView y ahora funciona. Parece que tampoco hay filtraciones. Entonces ahora estoy haciendo esto:

 // Erase polyline and polyline view if not nil. if (self.routeLine != nil) { //[_routeLine release]; self.routeLine = nil; } if (self.routeLineView != nil) { //[_routeLineView release]; self.routeLineView = nil; } 

Cuando llame a removeOverlays: la vista del map liberará los objects MKOverlay y MKOverlayView.

Tiene sus propias references a éstas en _routeLine y _routeLineView .

Después de removeOverlays: se llama, sus variables apuntarán a la memory ya liberada. Cuando vuelve a crear la polilínea, se está liberando de más y luego se produce un locking.

Elimine las llamadas de release :

 if (_routeLine != nil) { [_routeLine release]; // <-- remove this self.routeLine = nil; } if (_routeLineView != nil) { [_routeLineView release]; // <-- remove this self.routeLineView = nil; } 

Cuando pasa por el código en el depurador, ¿dónde aparece el error?

Una idea, puede tener un problema con su ciclo de retención / liberación para self.routeLine y self.routeLineView . Suponiendo que sean properties con un atributo retain , cuando lo haces

 self.routeLine = [MKPolyline polylineWithPoints:pointsArray count:2]; 

su accesor sintetizado retiene el nuevo object MKPolyline . Ese object también tendrá un par retener / autorelease del método de conveniencia que lo creó. Cuando se vuelve a llamar a este método y llama al

 if (self.routeLine != nil) { [_routeLine release]; self.routeLine = nil; } 

código, terminará liberando la variable dos veces, la primera con la llamada explícita [_routeLine release] y la segunda con el accessor sintetizado en el self.routeLine = nil; llamada. Permanecerá en la memory, pero bloqueará la aplicación cuando se drene la agrupación autorelease.

En la mayoría de los casos, para borrar todas las superposiciones en un MKMapView (denominado mapView en esta muestra), haría algo como lo siguiente:

 for (id<MKOverlay> overlayToRemove in mapView.overlays) { if ([overlayToRemove isKindOfClass:[OverlayClassToRemove class]]) { [mapView removeOverlay:overlayToRemove]; } } 

Swift 3 extenstion

 extension MKMapView { func removeAllOverlay(){ for overlay:MKOverlay in self.overlays { self.remove(overlay) } } }