3

试图让用户在我的应用程序中选择谷歌地图(sdk)和苹果地图(mapkit)。该应用程序未使用 ARC。崩溃场景(ios 6.0 / 6.1): 1. 进入谷歌地图(模态控制器)。2.退出谷歌地图(关闭模式)。3.在我的应用程序中更改为苹果地图(mapkit)。4.进入苹果地图(模态控制器)。

应用程序崩溃,我得到:[EAGLContext setCurrentContext:]

如果我不在 dealloc 中发布谷歌地图,则不会发生该错误,但它可能会导致内存泄漏。我在 viewDidLoad 中保留地图并在 dealloc 中释放地图。

谁能帮忙?谢谢,托默

更详细的堆栈跟踪:

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

适用于 iOS 的 Google Maps SDK 和使用 Apple Maps 的 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];

当我调查适用于 iOS 的 Google Maps SDK 的问题时,我基本上尝试了这些组合的各种组合,直到找到可行的方法。祝你好运!

于 2013-02-26T16:16:49.233 回答
4

我在尝试在 Apple 和 Google 地图之间切换时遇到了同样的问题。经过大量的实验,我也追踪到了发布谷歌地图和在 MapKit 中崩溃的交互。围绕其他调用或在按照建议发布 Google 地图后不使用 [EAGLContext setCurrentContext:nil] 调用会有所帮助。但是,在我的例子中,它总是用注释和覆盖重新绘制完整的 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 回答
0

这似乎已在 Google Maps iOS API 1.3.0 中得到修复,因此无需将 EAGLContext 设置为 nil。

于 2013-06-06T21:39:19.267 回答