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