2

我有一个 MKMapView,它在点击时(垂直)扩展(使用 UITapGestureRecognizer)并在 pan 上触发 api 调用(使用 UIPanGestureRecognizer)。

一切正常,直到一段时间后,在平移时,应用程序会崩溃,几乎没有任何有用的信息(或我能理解的信息)

异常断点已打开,并且僵尸对象已启用。在崩溃时,它永远不会遇到异常断点!

这是日志:(平移开始、平移、平移结束根据平移手势识别器状态打印出来)。平移结束后,应用程序立即崩溃。(地图尚未加载其所有图块,并且尚未调用 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 操作方法建立连接时,崩溃就消失了。

有没有办法在使用手势识别器时摆脱这种崩溃?或者有没有办法知道地图被点击和平移,而不使用 GestureRecognizers?

任何帮助/问题/答案/评论表示赞赏!


更新(1 月 19 日):这似乎根本不是平移手势识别器的问题。现在,在我尝试向 mapview 添加新注释,调用 [MapView setRegion: animated:] 并在 regionDidChangeAnimated 被击中之前崩溃,在它崩溃的地方使用相同的 [MKMapViewPositioningChange hasChanges] 日志,现在我让它崩溃了.


更新(1 月 23 日):我想我很确定发生了什么。有一段代码试图设置区域以包含 MKMapView 可见矩形中的所有注释,以及我正在调用的其他一些位置 [myMapView removeAnnotations:[myMapView annotations]]。而且,我的猜测是,这两个动作最终会导致令人讨厌的空中碰撞,没有留下任何导致坠机的线索。如果我的预感修复通过了 QA,将用答案更新问题

4

1 回答 1

3

正如我之前所猜测的(问题的第二次更新),这是尝试添加地图区域以显示所有注释并同时删除所有注释的问题。如果您正在调用 setRegion: animated: ,请确保检查 mapView 是否至少有一个注释。

此外,明智地使用以下代码会很有帮助,尤其是当您根据注释在地图上执行任何类型的动画时。

[MKMapView removeAnnotations:[MKMapView 注释]];

于 2013-01-30T06:56:12.530 回答