3

私のアプリでグーグルマップ(sdk)とアップルマップ(mapkit)のどちらかを選択するオプションをユーザーに提供しようとしています。アプリはARCを使用していません。クラッシュシナリオ(ios 6.0 / 6.1):1. googleマップ(モーダルコントローラー)を入力します。2.グーグルマップを終了します(モーダルを閉じます)。3.アプリをアップルマップ(mapkit)に変更します。4.アップルマップ(モーダルコントローラー)を入力します。

アプリがクラッシュし、次のようになります:[EAGLContext setCurrentContext:]

Deallocでグーグルマップをリリースしなければエラーは発生しませんが、おそらくメモリリークが発生します。マップをviewDidLoadに保持し、deallocでマップを解放します。

誰か助けてもらえますか?ありがとう、Tomer

より詳細なスタックトレース:

1   0x0a041324 in -[VGLGPU init] ()
2   0x0a041032 in __24+[VGLGPU sharedInstance]_block_invoke_0 ()
3   0x03b52014 in _dispatch_client_callout ()
4   0x03b4409f in dispatch_once_f ()
5   0x03b44061 in dispatch_once ()
6   0x0a040fef in +[VGLGPU sharedInstance] ()
7   0x09fab26b in -[VKMainLoop updateLinkState] ()
8   0x09fabb02 in -[VKMainLoop removeCanvas:] ()
9   0x09f9f2aa in -[VKScreenCanvas _updateDisplayStatus:] ()
10  0x09f9f3fb in -[VKScreenCanvas setNeedsDisplay] ()
11  0x027bc03d in -[UIView initWithFrame:] ()
12  0x09f75658 in -[VGLScreenCanvas initWithFrame:context:] ()
15  0x09f907e7 in -[VKMapCanvas initWithFrame:shouldRasterize:] ()
16  0x09f8982e in -[VKMapView initWithFrame:andGlobe:shouldRasterize:] ()
17  0x0267d1a1 in -[MKMapView _commonInitAndEnableLoading:fromIB:] ()
18  0x0267da9c in -[MKMapView initWithCoder:] ()
19  0x02aa8a02 in UINibDecoderDecodeObjectForValue ()
47  0x028671a7 in -[UIViewController presentModalViewController:animated:] ()
4

4 に答える 4

7

Apple Maps を使用する iOS 用 Google Maps SDK と MapKit の両方が OpenGL を利用します。

Google Maps SDK for iOS には、予期しない OpenGL コンテキストがアクティブな場合にクラッシュする可能性があるいくつかの問題があります。

http://code.google.com/p/gmaps-api-issues/issues/detail?id=4752

MapKit にも OpenGL コンテキストに関するいくつかの問題があるようです。

マップを表示すると、iOS 6 アプリが EAGLContext でクラッシュする

問題を停止する方法を見つけることができるかどうかを確認するには、おそらく試行錯誤が必要になるでしょう。マップで操作を実行する前および/または実行した後 (Google マップをリリースするときなど)、現在のコンテキストをクリアしてみてください。

[EAGLContext setCurrentContext:nil]

操作を実行する前に以前のコンテキストを保存してから、後で再度復元することもできます。次に例を示します。

EAGLContext* previousContext = [EAGLContext currentContext];

// Perform map operation here.

[EAGLContext setCurrentContext: previousContext];

Google Maps SDK for iOS に関する問題を調査していたとき、機能するものが見つかるまで、基本的にこれらのさまざまな組み合わせを試しました。幸運を!

于 2013-02-26T16:16:49.233 に答える
4

Apple マップと Google マップを切り替えようとすると、同じ問題が発生しました。多くの実験の後、私もそれを突き止めて、Google マップのリリースと MapKit でのクラッシュの相互作用にたどり着きました。[EAGLContext setCurrentContext:nil] 呼び出しを他の呼び出しの前後で使用したり、提案されたように Google マップをリリースした後に使用したりしないでください。しかし、私の場合、注釈とオーバーレイを使用して完全な Apple マップを常に再描画し、同じ [EAGLContext setCurrentContext:] 呼び出し内でクラッシュしました。

その知識に基づいて、MapKit プロトコル メソッド mapViewDidFinishLoadingMap 内に [EAGLContext setCurrentContext:nil] 呼び出しを追加することで、問題を解決することができました (またはそのように思われます)。

- (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView
{
    [EAGLContext setCurrentContext:nil];
}

私は今、喜んで前後に切り替えることができます。

ああ、私はこのプロジェクトで ARC を使用していません。

于 2013-03-02T23:26:49.217 に答える
0

これは、ARC を使用していないことに関連している可能性があります。開始セクションでは、ARC の使用がオンになっていることを確認するように常に言及しています。

于 2013-02-24T23:59:17.160 に答える