调用addOverlay时,MKMapView dealloc'ed

时间:2014-02-22 16:48:42

标签: ios mkmapview

当我在- (void)viewDidLoad

中调用时,我的mapView被解除分配存在问题
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. mapView&在mapView.delegate
  2. 中将nil设置为- (void) dealloc and in - (void)viewDidDisappear
  3. BOOL finishedLoading在视图加载时设置为FALSE,并在调用地图视图委托方法TRUE时设置为- (void)mapViewDidFinishRenderingMap:(MKMapView *)mapView fullyRendered:(BOOL)fullyRendered
  4. 似乎在方法完成之前调用了
  5. - (void)mapView:(MKMapView *)mapView didAddOverlayRenderers:(NSArray *)renderers
  6. 如何检查叠加层是否已完全添加?

    或者,如果视图控制器被解除,是否可以取消叠加?

    修改 视图控制器位于导航控制器堆栈中,并显示和弹出。 我自己没有使用任何线程。从乐器我可以看到还有另一个线程,所以我的猜测是addOverlay:正在某个地方创建一个线程。

    mapView是viewController的一个属性,也是委托。

1 个答案:

答案 0 :(得分:1)

在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];