我想在某个时刻删除地图的所有叠加层,我尝试了不同的方法,但它永远不会有效。
最后一次尝试[self.mapView removeOverlays:self.mapView.overlays];
,但仍然无效。知道如何删除这些叠加层吗?
谢谢。
更新1
我有错误:malloc: *** error for object 0x5adc0c0: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
我想我知道为什么,但不知道如何解决它... 当我需要在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;
所以我发布了routeLine
对象,这是前一个叠加层。因此,当我尝试删除它时,它会崩溃,因为它已被解除分配。
以下是用于添加叠加视图的mapView委托的代码:
- (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;
}
如果你们知道如何解决这个问题,从我的MKMapView中删除所有叠加层就太棒了!
更新2
我尝试不发布我的routeLine
和routeLineView
对象,现在就可以了。似乎也没有泄漏。所以现在我这样做:
// 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;
}
答案 0 :(得分:11)
当您致电removeOverlays:
时,地图视图将会发布MKOverlay和MKOverlayView对象。
您可以在_routeLine
和_routeLineView
中保留对这些内容的引用。
调用removeOverlays:
后,您的变量将指向已释放的内存。当您重新创建折线时,过度释放会导致崩溃。
请删除release
来电:
if (_routeLine != nil) {
[_routeLine release]; // <-- remove this
self.routeLine = nil;
}
if (_routeLineView != nil) {
[_routeLineView release]; // <-- remove this
self.routeLineView = nil;
}
答案 1 :(得分:7)
当你逐步调试调试器中的代码时,错误出现在哪里?
有人认为,self.routeLine
和self.routeLineView
的保留/发布周期可能存在问题。假设它们是具有retain
属性的属性,当您执行
self.routeLine = [MKPolyline polylineWithPoints:pointsArray count:2];
您的合成访问者保留新的MKPolyline
对象。该对象还将从创建它的方便方法中获得保留/自动释放对。再次调用此方法并调用
if (self.routeLine != nil) {
[_routeLine release];
self.routeLine = nil;
}
代码,您将最终释放变量两次,第一次使用显式[_routeLine release]
调用,第二次使用self.routeLine = nil;
调用的合成访问者。它将保留在内存中,但在您的自动释放池耗尽时会使应用程序崩溃。
在大多数情况下,要清除MKMapView
(此示例中名为mapView
)的所有叠加层,我会执行以下操作:
for (id<MKOverlay> overlayToRemove in mapView.overlays)
{
if ([overlayToRemove isKindOfClass:[OverlayClassToRemove class]])
{
[mapView removeOverlay:overlayToRemove];
}
}
答案 2 :(得分:1)
Swift 3扩展
mattresses