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

Ste*_*her 24 iphone memory-management mapkit mkmapview

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

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

这是怎么回事?

Ste*_*her 44

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

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

这在MKMapViewDelegate协议参考中有记录:

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

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

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

  • 谢谢.我的问题是我们是否应该以某种方式知道这一点.如果期望MapView的用户,那么为什么我们不必清除接受委托的所有控件的委托指针? (2认同)

Osc*_*car 18

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

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

注意:这也适用于UIWebView.

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