2013-04-18 67 views
1

我使用子類型MKOverlay和子類型MKOverlayView來顯示WMS切片。運行良好。刪除自定義MKOverlayView

當我完成顯示圖塊時,我遇到了刪除MKOverlayView的問題。我可以刪除MKOverlay就好:

-(void)removeWMSOverlay {  
    for (WMSOverlay *overlay in self.mapView.overlays) { 
     if ([overlay isKindOfClass:[WMSOverlay class]]) {    
      MKOverlayView *test = [self.mapView viewForOverlay:overlay]; 

      [self.mapView removeOverlay:overlay]; 
     } 
    } 
} 

WMSOverlayView仍然存在,仍然在運行它的代碼(不斷地檢查是否有新的瓷磚可以得出),它產生一定的滯後性。

我不知道在哪裏可以找到活躍的MKOverlayViews列表。我試過了:

-(void)removeWMSOverlay {  
    for (WMSOverlay *overlay in self.mapView.overlays) { 
     if ([overlay isKindOfClass:[WMSOverlay class]]) {    
      MKOverlayView *test = [self.mapView viewForOverlay:overlay]; 

      [self.mapView removeOverlay:overlay]; 

      [test removeFromSuperview]; 

      test = nil; 
     } 
    } 
} 

沒有效果。代碼仍在運行。

甚至試圖圍繞保持它的參考零:

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay { 
    if ([overlay isKindOfClass:[WMSOverlay class]]) { 

     WMSOverlayView *view = [[WMSOverlayView alloc] initWithOverlay:overlay]; 
     view.alpha = .8; 

     self.wmsOverlayView = view; 

     return view; 
    } 

    return FALSE; 
} 

-(void)removeScene {  
    for (WMSOverlay *overlay in self.mapView.overlays) { 
     if ([overlay isKindOfClass:[WMSOverlay class]]) {    
      [self.mapView removeOverlay:overlay]; 

      self.wmsOverlayView = nil; 
     } 
    } 
} 

我可以刪除MKOverlayView或者我需要弄清楚如何重用的看法?

編輯:

我試圖重用MKOverlayView

else if ([overlay isKindOfClass:[WMSOverlay class]]) { 
    self.wmsOverlayView = [[WMSOverlayView alloc] initWithOverlay:overlay]; 

    return self.wmsOverlayView; 
} 

,並添加一個計時器顯示一個以上MKOverLayView是乳寧:

-(void)amIStillHere { 
    DLog("I'M STILL RUNNING | self: %@", self); 
} 

他們沒有得到重用或者消失:

DEBUG | -[WMSOverlayView startTimer] | I'M STILL RUNNING | self: <WMSOverlayView: 0x1d84afe0; frame = (6.02801e+07 9.44092e+07; 2.30324e+06 2.10344e+06); opaque = NO; layer = <MKOverlayClusterProxyLayer: 0x21bf3ff0>> 
DEBUG | -[WMSOverlayView startTimer] | I'M STILL RUNNING | self: <WMSOverlayView: 0x21be1a80; frame = (6.06487e+07 9.2838e+07; 2.36776e+06 2.15038e+06); opaque = NO; layer = <MKOverlayClusterProxyLayer: 0x1d8e2a20>> 

回答

0

好奇的是,我添加了NSCacheDelegate以查看某個項目何時被驅逐(我擔心每個WMSOverlayView都有一個NSCache,以及它們的行爲方式和內存使用情況,我將緩存設置爲32mb,並且不想吞併所有記憶)。我嘗試命名每個緩存,這樣我就可以看到是否有兩個緩存,我可以看到是否清除了舊緩存,以便爲新緩存留出空間。而實現的每個高速緩存總是命名相同:

-(MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay { 
    if (self.wmsOverlayView == nil) { 
     self.wmsOverlayView = [[WMSOverlayView alloc] initWithOverlay:overlay withCacheName:@"CACHE!"]; 
    } 
    else { 
     self.wmsOverlayView = [[WMSOverlayView alloc] initWithOverlay:overlay withCacheName:@"THE NEW BETTER CACHE!"]; 
    } 

    return self.wmsOverlayView; 
} 

我也注意到,self.wmsOverlayView總是nil始終命名緩存CACHE!所以wmsOverlayView確實在覆蓋層被移除時被移除。但是我的計時器一直在關閉。所以我重構我的代碼來刪除計時器,當我刪除WMSOverlay時,緩存被清除(得到我的cache:willEvictObject: NSLog垃圾郵件)。

所以我相信計時器保持WMSOverlayView活着。

道德故事:不要在MKOverlayView中放置計時器。