Ios 删除自定义视图

Ios 删除自定义视图,ios,objective-c,mkmapview,mkoverlay,Ios,Objective C,Mkmapview,Mkoverlay,我正在使用子类MKOverlay和子类MKOverlayView来显示WMS分幅。运行良好 当我显示完瓷砖后,我遇到了删除MKOverlayView的问题。我可以很好地删除MKOverlay: -(void)removeWMSOverlay { for (WMSOverlay *overlay in self.mapView.overlays) { if ([overlay isKindOfClass:[WMSOverlay class]]) {

我正在使用子类
MKOverlay
和子类
MKOverlayView
来显示WMS分幅。运行良好

当我显示完瓷砖后,我遇到了删除
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
仍然存在,并且仍在运行其代码(不断检查是否可以绘制新的分幅),这造成了一些延迟

我不知道在哪里可以找到活动的
mkoverlayview
列表。我试过:

-(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正在运行:

-(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>>
DEBUG |-[WMSOverlayView startTimer]|我仍在运行| self:
调试|-[WMSOverlayView startTimer]|我仍在运行| self:

出于好奇,我添加了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;
}
-(MKOverlayView*)地图视图:(MKMapView*)地图视图覆盖:(id)覆盖{
如果(self.wmsOverlayView==nil){
self.wmsOverlayView=[[wmsOverlayView alloc]initWithOverlay:overlay withCacheName:@“CACHE!”;
}
否则{
self.wmsOverlayView=[[wmsOverlayView alloc]initWithOverlay:overlay withCacheName:@“新的更好的缓存!”];
}
返回self.wmsOverlayView;
}
我还注意到,
self.wmsOverlayView
总是
nil
并且总是命名缓存!。因此,当覆盖被删除时,
wmsOverlayView
确实会被删除。但我的计时器一直在响。因此,我重构了我的代码以删除计时器,当我删除
WMSOverlay
时,缓存被清除(得到了我的
cache:willexecuteobject:
NSLog垃圾邮件)

因此,我相信计时器使
WMSOverlayView
保持活动状态

这个故事的寓意是:不要在
MKOverlayView
中放置计时器

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