gpt4 book ai didi

iOS 删除 MKMapView 叠加层不起作用

转载 作者:技术小花猫 更新时间:2023-10-29 11:00:05 26 4
gpt4 key购买 nike

我想一次性删除 map 上的所有叠加层,我尝试了不同的方法,但都行不通。

上次尝试我做了 [self.mapView removeOverlays:self.mapView.overlays]; 但它仍然不起作用。知道如何删除这些覆盖层吗?

谢谢。

更新 1

我有错误:malloc: *** 对象 0x5adc0c0 错误:未分配正在释放的指针
*** 在malloc_error_break 设置断点调试

我想我知道为什么,但真的不知道如何解决...这是我需要在 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 对象,它是之前的覆盖层。所以当我试图删除它时,它崩溃了,因为它已经被释放了。

这是用于添加覆盖 View 的 mapView 委托(delegate)的代码:

- (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

我试着不释放我的 routeLinerouteLineView 对象,现在它可以工作了。似乎也没有泄漏。所以现在我正在这样做:

// 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;
}

最佳答案

当您调用 removeOverlays: 时, map View 将释放 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;
}

关于iOS 删除 MKMapView 叠加层不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6375266/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com