的MKMapView崩溃的应用时的视图控制器弹出

问题描述:

我有与调用的MKMapView崩溃的应用时的视图控制器弹出

[self.mapView setRegion:region animated:YES]; 

其重新定位在地图从A到B

其保持的MKMapView被设置为视图控制器一个的MKMapView视图控制器委托和

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated 

我有一些代码,会触发另一个setRegion:动画:到的MKMapView如此,地图将自动放大新的位置。

一切工作正常,如果我popViewControllerAnimated:视图控制器后,MKMapView动画完成平移和缩放。

但是,当我尝试popViewControllerAnimated:当前视图控制器WHILE MKMapView运行它的动画时,应用程序崩溃与“消息发送到释放实例”。

从调试器的外观来看,我认为MKMapView试图从弹出和释放的委托调用方法。

所以我在viewDidUnload试图

[self.mapView setDelegate:nil]; 
self.mapView = nil; 

没有运气。该应用程序仍然一直崩溃。

我唯一能想到的就是创建一个单独的新委托类,并从父视图控制器中保留该类,以便MKMapView有一个委托即使在包含它的视图控制器被释放后也可以调用。

这是怎么发生的? 有没有其他的“干净”选项?

+0

这很有趣。我们的应用程序被MKMapView调用委托以获取注释视图时发生的令人困惑的崩溃而瘫痪。问题在于那时没有MKMapView存在;或者不应该有。包含它的控制器早已被弹出。不知道是否是同样的问题。 – Oscar

+1

看起来像这样的问题:http://*.com/questions/2188098/why-am-i-crashing-after-mkmapview-is-freed-if-im-no-longer-using-it – Oscar

朋友帮我弄到了这个。

我实现了我自己的方法来弹出视图控制器,而不是使用默认导航控制器的后退按钮。我只需要添加[self.mapView setDelegate:nil];在我弹出视图控制器之前。

- (void)goBack 
{ 
    [self.mapView setDelegate:nil]; 
    [self.navigationController popViewControllerAnimated:YES]; 
} 
+3

它是不可能做到这一点viewWillDisappear? – Oscar

+0

+100它为我节省了很多时间! – Tomasz

+0

疯狂的苹果。 – jowie

好的,这是真正的答案。它来自苹果文档,但它从MKMapView中丢失。只有在其代理协议的文档中才能找到它:

“在释放已设置委托的MKMapView对象之前,请记住将该对象的委托属性设置为nil。一个可以执行此操作的位置在dealloc方法中你在那里处理地图视图。“

注意:这也适用于UIWebView。

我在代理的dealloc方法中将MapView的委托指针设置为nil,并且我们的崩溃似乎已被消除。

+0

这适用于可能比其代表寿命更长的_any_对象。 –

下面的代码很可能asolve您的问题:

-(void) viewWillDisappear:(BOOL)animated 
{ 
    self.mapView.delegate = nil; 
    mapView=Nil; 
    NSLog(@"viewWillDisappear"); 

} 
+0

你忘了调用viewWillDisappear的超级方法:animated – Neru

我的问题是不是由我的视图控制器

[self.mapView setDelegate设定的MKMapView的委托来解决无:无]。

我不得不在我的RootViewController中对包含MKMapView的UIViewController进行__strong引用。

__strong <#UIViewController#> * vcNewLocation;