Pregunta

I have a MKMapView that expands (vertically) on tap (using UITapGestureRecognizer) and fires off an api call on pan (using UIPanGestureRecoginizer).

Everything was working fine, until some time back, where on Panning, the app would crash, with hardly any useful info (or info that I could comprehend)

Exception breakpoints are on, and zombie objects have been enabled. On crashing, it never hits the exception breakpoint!

Here's the log: (Panning began, panning, panning ended are printed out based on the Pan gestureRecognizer states). Right after panning ends, the app crashes. (The map is yet to load all its tiles, and regionDidChangeAnimated is not called yet):

2013-01-17 14:46:04.396 MyApp[13126:c07] Panning Began
2013-01-17 14:46:04.412 MyApp[13126:c07] Panning
2013-01-17 14:46:04.412 MyApp[13126:c07] Panning
2013-01-17 14:46:04.557 MyApp[13126:c07] Panning
2013-01-17 14:46:04.606 MyApp[13126:c07] Panning
2013-01-17 14:46:04.691 MyApp[13126:c07] Panning Ended
2013-01-17 14:46:04.692 MyApp[13126:c07] *** -[MKMapViewPositioningChange hasChanges]: message sent to deallocated instance 0x139f7520

Here's the backtrace i see after the crash:

(lldb) bt
* thread #1: tid = 0x1c03, 0x02a4fa97 CoreFoundation`___forwarding___ + 295, stop reason = EXC_BREAKPOINT (code=EXC_I386_BPT, subcode=0x0)
    frame #0: 0x02a4fa97 CoreFoundation`___forwarding___ + 295
    frame #1: 0x02a4f94e CoreFoundation`_CF_forwarding_prep_0 + 14
    frame #2: 0x01244d27 MapKit`-[MKMapView(UserPositioningInternal) _runPositioningChange] + 2037
    frame #3: 0x01242dd7 MapKit`-[MKMapView(UserPositioningInternal) _runPositioningChangeIfNeeded:] + 86
    frame #4: 0x01240220 MapKit`-[MKMapViewInternal runPositioningChangeIfNeeded] + 50
    frame #5: 0x01e2eb90 Foundation`__NSFireTimer + 97
    frame #6: 0x02a1f376 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 22
    frame #7: 0x02a1ee06 CoreFoundation`__CFRunLoopDoTimer + 534
    frame #8: 0x02a06a82 CoreFoundation`__CFRunLoopRun + 1810
    frame #9: 0x02a05f44 CoreFoundation`CFRunLoopRunSpecific + 276
    frame #10: 0x02a05e1b CoreFoundation`CFRunLoopRunInMode + 123
    frame #11: 0x03c897e3 GraphicsServices`GSEventRunModal + 88
    frame #12: 0x03c89668 GraphicsServices`GSEventRun + 104
    frame #13: 0x0132d65c UIKit`UIApplicationMain + 1211
    frame #14: 0x0001223d MyApp`main + 141 at main.m:16
    frame #15: 0x00002fc5 MyApp`start + 53

The crashes go away the moment i take the connection for the PanGestureRecognizer action method.

Is there a way to get rid of this crash while using the gesture recognizers? or is there a way to know that the map was tapped and panned, without using GestureRecognizers?

Any help/questions/answers/comments appreciated!


Update (Jan 19): This doesn't seem to be an issue with the pan gesture recognizer at all. Now I am getting it to crash on after i try to add new annotations to the mapview, call [MapView setRegion: animated:], and crashes just before regionDidChangeAnimated is hit, with the same [MKMapViewPositioningChange hasChanges] log at the point where it crashes.


Update (Jan 23): I think I am quite sure whats happening. there is one chunk of code thats trying to set the region to include all the annotations in the visible rect of the MKMapView, and a few other locations, where I am calling [myMapView removeAnnotations:[myMapView annotations]]. And, my guess is that these two actions end up in a nasty mid-air collision, leaving no trail as to what lead to a crash. Will update the question with an answer if my hunch-fix passes QA

¿Fue útil?

Solución

As I had guessed earlier (second update to the question), this was an issue with trying the add set the map region to show all annotations, and removing all annotations simultaneously. if you are calling setRegion: animated: , make sure to check if the mapView has at least one annotation.

Also, it'll be helpful to use the following piece of code judiciously, especially if you are doing any type of animations on the map based on the annotations.

[MKMapView removeAnnotations:[MKMapView annotations]];

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top