2011-06-16 19 views
10

Me gustaría eliminar todas las superposiciones de mi mapa en un punto, e intenté de diferentes maneras, pero nunca funciona.iOS eliminando las superposiciones MKMapView que no funcionan

Última vez que lo hice [self.mapView removeOverlays:self.mapView.overlays]; y todavía no funciona. ¿Alguna idea de cómo puedo eliminar esas superposiciones?

Gracias.

ACTUALIZA 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 dibuje otra línea en mi MAPview:

// Create a c 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 liberar el objeto routeLine que es la superposición anterior. Entonces, cuando traté de eliminarlo, se cuelga porque ya ha sido desasignado.

Este es el código para el delegado MAPview para añadir puntos de vista de superposición:

- (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, la eliminación de todas las superposiciones de mi MKMapView que sería increíble!

ACTUALIZACIÓN 2

Traté de no liberar mis routeLine y routeLineView objetos y funciona ahora. Parece que no hay fugas también. Así que 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; 
} 

Respuesta

10

Cuando se llama a removeOverlays:, la vista del mapa dará a conocer los objetos MKOverlay y MKOverlayView.

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

Después de llamar al removeOverlays:, sus variables apuntarán a la memoria ya liberada. Cuando vuelves a crear la polilínea, estás liberando demasiado y luego se produce un bloqueo.

lo tanto eliminar las llamadas release:

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

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

Eso es lo que hice :) Muchas gracias @ Anna Karenina! – Dachmt

7

Cuando paso a través del código en el depurador, donde demuestran el error de hasta?

Una idea, es posible que tenga un problema con su retención/ciclo de liberación para self.routeLine y self.routeLineView. Suponiendo que son propiedades con un atributo retain, cuando lo hace

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

su descriptor de acceso sintetizado está reteniendo el nuevo MKPolyline objeto. Ese objeto también tendrá un par de retención/liberación automática del método de conveniencia que lo creó. Cuando este método se llama de nuevo y se llama al código

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

, el resultado final será la liberación de la variable dos veces, la primera con la explícita [_routeLine release] llamada y el segundo con el descriptor de acceso sintetizado en la llamada self.routeLine = nil;. Permanecerá en la memoria, pero bloqueará la aplicación cuando se vacíe el grupo de autorrelease.

En la mayoría de los casos, para borrar todas las superposiciones en una MKMapView (llamado mapView en esta muestra), me gustaría hacer algo como lo siguiente:

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

Los 'polylineWithPoints: contar:' toma una matriz C de estructuras MKMapPoint. – Anna

+0

Me gusta la forma de eliminar las superposiciones que me contaste, y pensé que funcionaría, o al menos no bloquearía la aplicación. Pero lo hizo y tengo el mismo error. @ Ana Karenina ¿La forma en que almaceno los puntos es en ese momento? Traté de almacenar en un 'NSArray' y ni siquiera puedo agregar este tipo de objeto en él de todos modos. – Dachmt

+0

@Dachmt y @Anna Karenina Soy corregido. Eso es lo que obtengo por adivinar cosas que no he hecho yo mismo. Editaré mi respuesta. – Kongress

0

Swift 3 extenstion

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

} 
Cuestiones relacionadas