调用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 

它只会在我过早关闭包含地图视图的视图控制器时发生。 如果我等了几秒钟它就不会崩溃。 视图控制器通过从导航控制器弹出它而被解雇,

我尝试了几种选择:

  1. mapViewmapView.delegate设置为nil in - (void) dealloc and in - (void)viewDidDisappear
  2. BOOL finishedLoading在视图加载时设置为FALSE ,并在地图视图委托方法设置为TRUE- (void)mapViewDidFinishRenderingMap:(MKMapView *)mapView fullyRendered:(BOOL)fullyRendered被调用。
  3. - (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];