我正在使用子类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>>
答案 0 :(得分: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
。