1

我正在使用子类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仍然存在并且仍在运行其代码(不断检查是否可以绘制新图块),这会产生一些滞后。

我不知道在哪里可以找到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>>
4

1 回答 1

0

好奇的是,我添加了 NSCacheDelegate 以查看项目何时被驱逐(我担心每个项目都有一个 NSCacheWMSOverlayView以及它们的行为和内存使用情况,我将缓存设置为 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.

于 2013-04-27T16:19:37.203 回答