当视图控制器popup时MKMapView崩溃的应用程序

我有一个视图控制器与调用的MKMapView

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

将地图从A重新定位到B

保存MKMapView的视图控制器被设置为委托和in

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

我有一些代码会触发另一个setRegion:animated:到MKMapView,以便地图自动放大新的位置。

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

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

从debugging器的外观来看,我认为MKMapView试图从popup和释放的代理中调用一个方法。

所以我试了

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

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

我唯一能想到的是创build一个单独的新的委托类,并从父视图控制器保留该类,以便MKMapView将有一个委托调用,即使包含它的视图控制器被取消分配。

为什么发生这种情况? 有没有其他“干净的”选项?

一位朋友帮我弄到了这个。

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

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

好的,这是真正的答案。 这是从苹果文档,但它从MKMapView中丢失。 它只在其代表协议的文档中find:

“在释放已设置委托的MKMapView对象之前,请记住将该对象的委托属性设置为nil。一个可以执行此操作的地方是在dealloc方法中,您将废弃map视图。

注意:这也适用于UIWebView。

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

我的问题是没有解决的问题是在我的视图控制器中设置MKMapView的委托为零

[self.mapView setDelegate:nil];

我不得不在我的RootViewController中创build一个包含MKMapView的UIViewController的__strong引用。

__strong <#UIViewController#> * vcNewLocation;

以下代码可能会解决您的问题:

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