我有MKMapView
。有时在我的视图控制器被解雇后,我会得到一个EXC_BAD_ACCESS
。
我打开NSSZombies
,它看起来像MKMapView
的委托 - 我的视图控制器! - 正在调用,尽管释放了MKMapView
和UIViewController
子类。我已经检查了,我的记忆管理是正确的。
发生了什么事?
答案 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)
在我的情况下,问题是,我第一次启动应用程序时,我不会按下"允许"提示进行位置授权时(意外!!)。
卸载应用并重新安装,当出现提示时,我允许授权,不再崩溃!