24

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

我打开了NSSZombies它,它看起来像MKMapView's 代表——我的视图控制器!— 被调用,尽管MKMapViewUIViewController子类都被释放了。我已经检查过了,我的内存管理是正确的。

这是怎么回事?

4

4 回答 4

44

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

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

这记录在MKMapViewDelegate 协议参考中:

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

编辑:也给 Oscar 一个赞成票,就在下面,谁在这里提供了文档报价。

鉴于 ARC,我建议这意味着您应该nil在视图控制器的dealloc.

于 2010-02-02T22:18:17.373 回答
18

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

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

注意:这也适用于 UIWebView。

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

于 2011-11-20T21:20:14.543 回答
2

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

于 2011-09-02T16:57:32.233 回答
0

就我而言,问题是我第一次启动应用程序时在提示位置授权时没有按“允许”(不小心!!)。

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

于 2015-05-21T15:11:09.683 回答