Why am I crashing after MKMapView is freed if I'm no longer using it?

人盡茶涼 提交于 2019-11-27 11:35:42

This is because of the way MKMapView works. There's an operation pending, so MapKit is retaining the MKMapView and it hasn't actually been deallocated yet. That isn't itself a problem. The problem is that it's still sending messages to your delegate.

The workaround is simple: As part of your view controller's cleanup set the map view's delegate to nil, which will prevent MKMapView from sending messages to it.

This is documented in MKMapViewDelegate Protocol Reference:

Before releasing an MKMapView object for which you have set a delegate, remember to set that object’s delegate property to nil. One place you can do this is in the dealloc method where you dispose of the map view.

Edit: Give Oscar an upvote as well, just below, who provided the documentation quote here.

Given ARC, I suggest this means you should set your map view's delegate to nil in your view controller's dealloc.

Oscar

OK, this is the confirmation of the answer. It's from the Apple doc, but it's missing from MKMapView. It's only found under the documentation for its delegate protocol:

Before releasing an MKMapView object for which you have set a delegate, remember to set that object’s delegate property to nil. One place you can do this is in the dealloc method where you dispose of the map view.

NOTE: This also applies to UIWebView.

I set the MapView's delegate pointer to nil in the delegate's dealloc method, and our crashes seem to have been eliminated.

Setting the map view's delegate to nil didn't work for me. However, setting showsUserLocation=NO on the delegate worked by making sure no location updates are received.

The problem, in my case, was that first time I launched app I don't press "allow" when prompting for location authorization (accidentally!!).

Uninstalling app and re-installing it, when prompt appear I allow the authorizations and no more crash!

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!