Me gustaría quitar todas las superposiciones de mi mapa en un punto, y he probado de diferentes maneras, pero nunca funciona.

Último intento me hizo [self.mapView removeOverlays:self.mapView.overlays]; y aún así no funciona. Alguna idea de como puedo quitar esas superposiciones?

Gracias.

ACTUALIZACIÓN de 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 tengo que dibujar 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 me suelte el routeLine objeto que es el anterior de superposición. Así que cuando he tratado de eliminar, se bloquea, porque ya se ha desasignado.

Aquí está el código para el mapView delegado para añadir superposición de puntos de vista:

- (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 como puedo solucionar este problema, la eliminación de todas las superposiciones de mi MKMapView sería impresionante!

ACTUALIZACIÓN 2

Traté de no liberar a mi routeLine y routeLineView objetos y funciona ahora. Parece que no hay fugas. Así que ahora, voy a hacer 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;
}

OriginalEl autor Dachmt | 2011-06-16

3 Comentarios

  1. 11

    Cuando llame removeOverlays:, la vista del mapa de la liberación de la MKOverlay y MKOverlayView objetos.

    Usted mantenga sus propias referencias a estos en _routeLine y _routeLineView.

    Después de removeOverlays: se llama, las variables estará apuntando ya lanzado la memoria. Cuando se vuelve a crear la polilínea, que son más liberadora, que luego se traduce en un accidente.

    Para quitar el release llamadas:

    if (_routeLine != nil) {
        [_routeLine release];  //<-- remove this
        self.routeLine = nil;
    }
    
    if (_routeLineView != nil) {
        [_routeLineView release];  //<-- remove this
        self.routeLineView = nil;
    }
    Eso es lo que hice 🙂 muchas Gracias @Anna Karenina!

    OriginalEl autor

  2. 7

    Cuando paso por el código en el depurador, ¿de dónde viene el error?

    Un pensamiento, usted puede tener un problema con tu retener/ciclo de lanzamiento para self.routeLine y self.routeLineView. Asumiendo que son propiedades con un retain atributo, al hacer

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

    su sintetizado descriptor de acceso es retener la nueva MKPolyline objeto. Ese objeto también tendrá una retener/grupo de liberación automática de par desde la comodidad método que se ha creado. Cuando este método se llama de nuevo y se llama a la

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

    código, se acabará la liberación de la variable dos veces, la primera con la explícita [_routeLine release] de la llamada y la segunda con el sintetizado de descriptor de acceso en el self.routeLine = nil; llamada. Va a permanecer en la memoria, pero se bloqueará la aplicación cuando el grupo de liberación automática de la piscina es drenado.

    En la mayoría de los casos, para borrar todas las superposiciones en un MKMapView (nombre mapView en este ejemplo), me gustaría hacer algo como lo siguiente:

    for (id<MKOverlay> overlayToRemove in mapView.overlays)
    {
       if ([overlayToRemove isKindOfClass:[OverlayClassToRemove class]])
       {
           [mapView removeOverlay:overlayToRemove];
       }
    }
    El polylineWithPoints:count: método toma una matriz C de MKMapPoint estructuras.
    Me gusta la manera de eliminar las superposiciones que me dijo, y pensé que no iba a funcionar, o al menos no bloquee la aplicación. Pero lo hice y tengo el mismo error. @Anna Karenina La forma de almacenar los puntos que es correcto entonces? Traté de guardar en un NSArray y no puede incluso agregar este tipo de objeto en ella de todos modos.
    y @Anna Karenina acepto la corrección. Que es lo que me pasa para adivinar las cosas que no he hecho a mí mismo. Voy a editar mi respuesta.
    Me hizo quitar la [_routeLine release]; y [_routeLineView release]; y funciona ahora. Por favor, busque en ACTUALIZACIÓN 2 y que me haga saber si usted piensa que si hay algo mal.
    Hace sentido. Lo siento, no pude terminar mi editar antes imaginé que fuera 🙂

    OriginalEl autor Kongress

  3. 1

    Swift 3 extenstion

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

    OriginalEl autor Varun Naharia

Dejar respuesta

Please enter your comment!
Please enter your name here