iOS supprimant les superpositions MKMapView ne fonctionnant pas
Je voudrais enlever toutes les superpositions de ma carte à un moment donné, et j'ai essayé de différentes manières, mais il ne fonctionne jamais.
Dernier essai, je n'ai [self.mapView removeOverlays:self.mapView.overlays];
et cela ne fonctionne toujours pas. Une idée de comment je peux supprimer ces superpositions?
Merci.
Mise à JOUR de 1
J'ai l'erreur: malloc: *** error for object 0x5adc0c0: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Je pense que je sais pourquoi, mais ne sais vraiment pas comment le résoudre...
Voici le code quand j'ai besoin de tirer une autre ligne sur mon 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;
J'ai donc communiqué de la routeLine
objet qui est la superposition précédente. Alors quand j'ai essayé de l'enlever, il se bloque parce qu'il a déjà été libéré.
Voici le code pour la mapView délégué pour l'ajout de superposition de points de vue:
- (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 vous le savez comment je peux résoudre ce problème, en supprimant toutes les superpositions de mon MKMapView ce serait génial!
Mise à JOUR 2
J'ai essayé de ne pas déclencher mon routeLine
et routeLineView
des objets et cela fonctionne maintenant. Il semble qu'il n'y a pas de fuites. Alors maintenant, je suis en train de faire ceci:
//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;
}
source d'informationauteur Dachmt
Vous devez vous connecter pour publier un commentaire.
Lorsque vous appelez
removeOverlays:
la vue de la carte va sortir la MKOverlay et MKOverlayView objets.Vous maintenez vos propres références présentes dans
_routeLine
et_routeLineView
.Après
removeOverlays:
est appelé, vos variables pointe déjà libéré de la mémoire. Lorsque vous re-créer la polyligne, vous êtes au-dessus de libération, qui se traduit alors dans un accident.Donc, supprimer le
release
appels:Lorsque vous entrez le code dans le débogueur, d'où vient l'erreur?
Une pensée, vous pouvez avoir un problème avec votre garder/cycle de publication pour
self.routeLine
etself.routeLineView
. En supposant qu'ils sont des propriétés avec unretain
attribut, lorsque vous nevotre synthétisé accesseur est de conserver le nouveau
MKPolyline
objet. Cet objet aura aussi la conserver/autorelease paire de la méthode de convenance qui l'a créé. Lorsque cette méthode est appelée de nouveau et vous appelez lacode, vous allez vous retrouver en relâchant la variable deux fois, la première avec l'explicite
[_routeLine release]
appel et le second avec la synthèse de l'accesseur sur laself.routeLine = nil;
appel. Il restera dans la mémoire, mais le plantage de l'application lors de votre autorelease pool est drainée.Dans la plupart des cas, pour effacer toutes les superpositions sur un
MKMapView
(nommémapView
dans cet exemple), j'aimerais faire quelque chose comme ce qui suit:Swift 3 extenstion