问题
I have a MKMapView
. Sometimes after my view controller is dismissed, I'll get a EXC_BAD_ACCESS
.
I turned on NSSZombies
and it looks like the MKMapView
's delegate — my view controller! — is being called, despite both the MKMapView
and UIViewController
subclass being freed. I've checked, and my memory management is correct.
What's going on?
回答1:
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
.
回答2:
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.
回答3:
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.
回答4:
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!
来源:https://stackoverflow.com/questions/2188098/why-am-i-crashing-after-mkmapview-is-freed-if-im-no-longer-using-it