6

我有一个带有 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 即使在包含它的视图控制器被释放后也有一个委托可以调用。

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

4

5 回答 5

14

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

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

- (void)goBack
{
    [self.mapView setDelegate:nil];
    [self.navigationController popViewControllerAnimated:YES];
}
于 2011-09-02T01:26:35.813 回答
8

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

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

注意:这也适用于 UIWebView。

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

于 2011-11-20T21:18:33.390 回答
0

通过在我的视图控制器中将 MKMapView 的委托设置为 nil 并没有解决我的问题

[self.mapView setDelegate:nil];

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

__strong <#UIViewController#> *vcNewLocation;

于 2015-11-21T09:45:29.457 回答
0

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

弹出时,deinit用于崩溃的方法。

所以在按下后退按钮时,我只需添加这一行mapView.deselectAnnotation(selectedAnnotation, animated: false),它就解决了崩溃。

于 2019-04-25T10:19:02.240 回答
-1

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

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

}
于 2013-04-18T11:37:10.960 回答