2011-06-16 109 views
10

我想刪除我的地圖的所有疊加在一點,我嘗試了不同的方式,但它從來沒有工作。iOS刪除MKMapView疊加不起作用

最後嘗試我做了[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

我試過不釋放我的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; 
} 

回答

10

當你調用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; 
} 
+0

這就是我做的:) 非常感謝@Anna Karenina! – Dachmt 2011-06-16 18:27:07

7

當您在調試器中逐步執行代碼時,哪裏出現錯誤?

有人認爲,您的保留/發佈週期可能存在self.routeLineself.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]; 
    } 
} 
+1

的'polylineWithPoints:計數:'方法需要MKMapPoint結構的C數組。 – Anna 2011-06-16 17:40:49

+0

我喜歡去除你告訴我的覆蓋圖的方式,並認爲它會起作用,或者至少不會使應用程序崩潰。但它確實和我有同樣的錯誤。 @Anna Karenina我存儲積分的方式是正確的嗎?我嘗試存儲在一個'NSArray'中,無論如何都不能添加這種類型的對象。 – Dachmt 2011-06-16 17:48:00

+0

@Dachmt和@Anna Karenina我表態改正了。這就是我所猜測的事情,我沒有做過自己。我會編輯我的答案。 – Kongress 2011-06-16 17:56:31

0

夫特3 extenstion

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

}