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?
This is because of the way
MKMapViewworks. There’s an operation pending, so MapKit is retaining theMKMapViewand 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 preventMKMapViewfrom sending messages to it.This is documented in MKMapViewDelegate Protocol Reference:
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
nilin your view controller’sdealloc.