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

后端 未结 4 505
误落风尘
误落风尘 2020-12-02 15:00

I have a MKMapView. Sometimes after my view controller is dismissed, I\'ll get a EXC_BAD_ACCESS.

I turned on NSSZombies and it

相关标签:
4条回答
  • 2020-12-02 15:25

    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.

    0 讨论(0)
  • 2020-12-02 15:28

    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.

    0 讨论(0)
  • 2020-12-02 15:36

    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!

    0 讨论(0)
  • 2020-12-02 15:40

    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.

    0 讨论(0)
提交回复
热议问题