当视图控制器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"); }