2

タップすると(UITapGestureRecognizerを使用して)展開し、(UIPanGestureRecoginizerを使用して)パンでAPI呼び出しを起動するMKMapViewがあります。

Panningでアプリがクラッシュし、有用な情報(または私が理解できる情報)がほとんどない状態になるまで、すべてが正常に機能していました。

例外ブレークポイントがオンになっており、ゾンビオブジェクトが有効になっています。クラッシュしても、例外ブレークポイントに到達することはありません。

ログは次のとおりです:(パン開始、パン、終了は、パンジェスチャー認識機能の状態に基づいて出力されます)。パンが終了した直後に、アプリがクラッシュします。(マップはまだすべてのタイルをロードしておらず、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 setRegion:animated:]を呼び出し、regionDidChangeAnimatedがヒットする直前にクラッシュし、クラッシュした時点で同じ[MKMapViewPositioningChangehasChanges]ログが表示されます。 。


更新(1月23日):何が起こっているのかはかなり確信していると思います。MKMapViewの表示された部分にすべての注釈を含めるように領域を設定しようとしているコードのチャンクと、[myMapView removeAnnotations:[myMapViewannotations]]を呼び出している他のいくつかの場所があります。そして、私の推測では、これらの2つのアクションは、厄介な空中衝突に終わり、何がクラッシュにつながるかについての痕跡を残していません。私のハンチフィックスがQAに合格した場合、質問を回答で更新します

4

1 に答える 1

3

以前に推測したように (質問の 2 回目の更新)、これは、すべての注釈を表示するようにマップ領域を設定し、すべての注釈を同時に削除しようとした場合の問題でした。setRegion: animation: を呼び出している場合は、mapView に少なくとも 1 つの注釈があるかどうかを確認してください。

また、特にアノテーションに基づいてマップ上で何らかのアニメーションを行う場合は、次のコードを慎重に使用すると役立ちます。

[MKMapView removeAnnotations:[MKMapView 注釈]];

于 2013-01-30T06:56:12.530 に答える