MKMapView setRegion: animated: вылетает приложение (отредактировано)
У меня есть MKMapView, который расширяется (по вертикали) при нажатии (с помощью UITapGestureRecognizer) и запускает вызов API на панели (с помощью UIPanGestureRecoginizer).
Все работало нормально, пока какое-то время назад, при панорамировании, приложение не работало, практически без какой-либо полезной информации (или информации, которую я мог бы понять).
Точки останова исключений включены, и объекты зомби были включены. При сбое он никогда не достигает точки останова исключения!
Вот журнал: (Панорамирование началось, панорамирование, окончание панорамирования распечатаны на основе состояний Pan gestRecognizer). Сразу после окончания панорамирования приложение вылетает. (Карта еще не загрузила все свои тайлы, а regionDidChangeAnimated еще не вызывается):
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
Вот след, который я вижу после аварии:
(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
Сбои исчезают, как только я подключаюсь к методу действия PanGestureRecognizer.
Есть ли способ избавиться от этого сбоя при использовании распознавателей жестов? или есть способ узнать, что карта была нажата и панорамирована, без использования GestureRecognizer?
Любая помощь / вопросы / ответы / комментарии приветствуются!
Обновление (19 января): Похоже, что это вообще не проблема с распознавателем панорамирования. Теперь я получаю его сбой после того, как я пытаюсь добавить новые аннотации в представление карты, вызываю [MapView setRegion: animated:] и вылетает непосредственно перед попаданием regionDidChangeAnimated, с тем же журналом [MKMapViewPositionChange hasChanges] в точке, где происходит сбой,
Обновление (23 января): Я думаю, что я вполне уверен, что происходит. есть один кусок кода, который пытается установить область, чтобы включить все аннотации в видимом прямоугольнике MKMapView, и несколько других мест, куда я звоню [myMapView removeAnnotations:[myMapView annotations]]. И я предполагаю, что эти два действия заканчиваются неприятным столкновением в воздухе, не оставляя следов того, что привело к катастрофе. Обновит вопрос с ответом, если моя догадка пройдет QA
1 ответ
Как я уже догадывался ранее (второе обновление вопроса), это была проблема с попыткой добавления установить область карты для отображения всех аннотаций и одновременного удаления всех аннотаций. если вы вызываете setRegion: animated:, убедитесь, что у mapView есть хотя бы одна аннотация.
Кроме того, будет полезно разумно использовать следующий фрагмент кода, особенно если вы делаете какие-либо анимации на карте на основе аннотаций.
[MKMapView removeAnnotations: [MKMapView аннотации]];