弹出视图控制器时,MKMapView会崩溃应用程序

时间:2011-09-01 10:53:53

标签: iphone objective-c ios mkmapview mkmapviewdelegate

我有一个带有调用

的MKMapView的视图控制器
[self.mapView setRegion:region animated:YES]; 

将地图从A重新定位到B.

将包含MKMapView的视图控制器设置为委托,并在

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

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

如果我是popViewControllerAnimated,那么一切正常:在MKMapView动画完成平移和缩放之后的视图控制器。

然而,当我尝试popViewControllerAnimated时:当前视图控制器在MKMapView运行它的动画时,应用程序崩溃并且“消息已发送到解除分配的实例”。

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

所以我试过

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

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

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

为什么会这样? 还有其他“干净”的选择吗?

5 个答案:

答案 0 :(得分:14)

一位朋友帮助我得到了这个。

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

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

答案 1 :(得分:8)

好的,这才是真正的答案。它来自Apple文档,但它从MKMapView中丢失了。它只能在其委托协议的文档中找到:

“在释放已设置委托的MKMapView对象之前,请记住将该对象的委托属性设置为nil。您可以在dealloc方法中处理地图视图。”

注意:这也适用于UIWebView。

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

答案 2 :(得分:0)

我的问题没有通过在我的视图控制器

中将MKMapView的委托设置为nil来解决
  

[self.mapView setDelegate:nil];

我必须在我的RootViewController中创建一个包含MKMapView的UIViewController的__strong引用。

  

__ strong< #UIViewController#> * vcNewLocation;

答案 3 :(得分:0)

我已经完成了聚类,并像mapView.selectAnnotation(annotation, animated: true)这样标记所选的注释。

弹出时,deinit方法曾经崩溃。

因此,按下返回按钮时,我仅添加了这一行mapView.deselectAnnotation(selectedAnnotation, animated: false),它解决了崩溃问题。

答案 4 :(得分:-1)

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

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

}