如果我不再使用MKMapView,为什么我会崩溃?

时间:2010-02-02 22:10:36

标签: iphone memory-management mapkit mkmapview

我有MKMapView。有时在我的视图控制器被解雇后,我会得到一个EXC_BAD_ACCESS

我打开NSSZombies,它看起来像MKMapView的委托 - 我的视图控制器! - 正在调用,尽管释放了MKMapViewUIViewController子类。我已经检查了,我的记忆管理是正确的。

发生了什么事?

4 个答案:

答案 0 :(得分:44)

这是因为MKMapView的工作方式。有一个挂起的操作,所以MapKit保留MKMapView并且它实际上还没有被释放。这本身不是问题。问题是它仍在向你的代表发送消息。

解决方法很简单:作为视图控制器清理的一部分,将地图视图的委托设置为nil,这将阻止MKMapView向其发送消息。

MKMapViewDelegate Protocol Reference中记录了这一点:

  

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

编辑:给Oscar一个upvote,就在下面,谁在这里提供了文档引用。

鉴于ARC,我建议您在视图控制器nil中将地图视图的委托设置为dealloc

答案 1 :(得分:18)

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

  

在发布已设置了a的MKMapView对象之前   委托,记得将该对象的委托属性设置为nil。一   你可以这样做的地方是你处理的dealloc方法   地图视图。

注意:这也适用于UIWebView。

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

答案 2 :(得分:2)

将地图视图的委托设置为nil对我不起作用。但是,通过确保没有收到位置更新,在委托上设置showsUserLocation=NO

答案 3 :(得分:0)

在我的情况下,问题是,我第一次启动应用程序时,我不会按下"允许"提示进行位置授权时(意外!!)。

卸载应用并重新安装,当出现提示时,我允许授权,不再崩溃!