我有一个MKMapView
. 有时在我的视图控制器被解雇后,我会得到一个EXC_BAD_ACCESS
.
我打开了NSSZombies
它,它看起来像MKMapView
's 代表——我的视图控制器!— 被调用,尽管MKMapView
和UIViewController
子类都被释放了。我已经检查过了,我的内存管理是正确的。
这是怎么回事?
我有一个MKMapView
. 有时在我的视图控制器被解雇后,我会得到一个EXC_BAD_ACCESS
.
我打开了NSSZombies
它,它看起来像MKMapView
's 代表——我的视图控制器!— 被调用,尽管MKMapView
和UIViewController
子类都被释放了。我已经检查过了,我的内存管理是正确的。
这是怎么回事?
这是因为工作方式MKMapView
。有一个操作挂起,所以 MapKit 保留了MKMapView
它,实际上它还没有被释放。这本身不是问题。问题是它仍在向您的代表发送消息。
解决方法很简单:作为视图控制器清理的一部分,将地图视图的委托设置为nil
,这将阻止MKMapView
向其发送消息。
这记录在MKMapViewDelegate 协议参考中:
在释放您已为其设置委托的 MKMapView 对象之前,请记住将该对象的委托属性设置为 nil。您可以在其中处理地图视图的 dealloc 方法中执行此操作。
编辑:也给 Oscar 一个赞成票,就在下面,谁在这里提供了文档报价。
鉴于 ARC,我建议这意味着您应该nil
在视图控制器的dealloc
.
好的,这是对答案的确认。它来自 Apple 文档,但 MKMapView 中缺少它。它只能在其委托协议的文档中找到:
在释放您已为其设置委托的 MKMapView 对象之前,请记住将该对象的委托属性设置为 nil。您可以在其中处理地图视图的 dealloc 方法中执行此操作。
注意:这也适用于 UIWebView。
我在委托的 dealloc 方法中将 MapView 的委托指针设置为 nil,我们的崩溃似乎已经消除。
将地图视图的委托设置nil
为对我不起作用。但是,showsUserLocation=NO
通过确保没有收到位置更新来设置委托。
就我而言,问题是我第一次启动应用程序时在提示位置授权时没有按“允许”(不小心!!)。
卸载应用程序并重新安装它,当出现提示时我允许授权并且不再崩溃!