调用addOverlay时,MKMapView dealloc’ed
当我调用它时,我的mapView被解除分配时出现问题- (void)viewDidLoad
NSString *template = @"http://tile.openstreetmap.org/{z}/{x}/{y}.png"; self.onlineOverlay = [[MKTileOverlay alloc] initWithURLTemplate:template]; self.onlineOverlay.canReplaceMapContent = YES; [_mapView addOverlay:self.onlineOverlay level:MKOverlayLevelAboveLabels];
日志是:(启用僵尸对象)
*** -[VKRasterOverlayTileSource invalidateRect:level:]: message sent to deallocated instance 0xf1863e0
它只会在我过早关闭包含地图视图的视图控制器时发生。 如果我等了几秒钟它就不会崩溃。 视图控制器通过从导航控制器弹出它而被解雇,
我尝试了几种选择:
-
mapView
和mapView.delegate
设置为nil
in- (void) dealloc and in - (void)viewDidDisappear
-
BOOL finishedLoading
在视图加载时设置为FALSE
,并在地图视图委托方法设置为TRUE
时- (void)mapViewDidFinishRenderingMap:(MKMapView *)mapView fullyRendered:(BOOL)fullyRendered
被调用。 -
- (void)mapView:(MKMapView *)mapView didAddOverlayRenderers:(NSArray *)renderers
似乎在方法完成之前被调用。
如何检查叠加层是否已完全添加?
或者,如果视图控制器被解除,是否可以取消叠加?
编辑:视图控制器位于导航控制器堆栈中并显示和弹出。 我自己没有使用任何线程。 从乐器我可以看到有另一个线程,所以我的猜测是addOverlay:
在某个地方创建一个线程。
mapView是viewController的一个属性,也是委托。
在tileOverlay子类中设置指向mapView的指针。 这样,在调用结果块时,mapView仍然存在。 您必须在tileOverlay子类中手动添加mapView属性。
NSString *template = @"http://tile.openstreetmap.org/{z}/{x}/{y}.png"; self.onlineOverlay = [[MKTileOverlay alloc] initWithURLTemplate:template]; self.onlineOverlay.canReplaceMapContent = YES; self.onlineOverlay.mapView = _mapView; [_mapView addOverlay:self.onlineOverlay level:MKOverlayLevelAboveLabels];