3

我创建了一个使用 MapKit 和 GoogleMaps 框架的非常简单的应用程序,并尝试在两个地图之间切换。我正在使用 ARC (ios 6.1) 和 Google Maps SDK for iOS 版本:1.1.1.2311。在几次切换后,应用程序崩溃了[EAGLContext setCurrentContext:]——总是在 MapKit 代码中。在之前的帖子中有一些建议 - 尝试[EAGLContext setCurrentContext:nil]在不同的地方设置,但它没有帮助。

stack trace:
Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x0000000c
Crashed Thread:  0

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   OpenGLES                        0x33beeb12 +[EAGLContext setCurrentContext:] + 74
1   VectorKit                       0x383cada4 -[VGLGPU setPaused:] + 120
2   VectorKit                       0x383bad70 -[VKMainLoop updateLinkState] + 492
3   VectorKit                       0x383c7334 -[VKAnimation startWithStepHandler:completionHandler:] + 112
4   VectorKit                       0x383d657a -[VKBuildingFootprintMapModel _reloadStyleAnimated:] + 474
5   VectorKit                       0x383d6398 -[VKBuildingFootprintMapModel setActive:] + 84
6   VectorKit                       0x383d5ef4 -[VKModelObject setSupermodel:] + 44
7   VectorKit                       0x383d624a -[VKModelObject insertSubmodel:atIndex:] + 142
8   VectorKit                       0x383d615a -[VKMapRasterizer addSubmodel:] + 322
9   VectorKit                       0x383d5cb4 -[VKMapModel addSubmodel:] + 136
10  VectorKit                       0x383cf1c4 -[VKMapModel forceMapType:] + 1532
11  VectorKit                       0x383cc568 -[VKMapModel initWithTransform:shouldRasterize:] + 2016
12  VectorKit                       0x383cbd80 -[VKMapModel initShouldRasterize:] + 36
13  VectorKit                       0x383c9678 -[VKMapCanvas initWithFrame:shouldRasterize:] + 356
14  VectorKit                       0x383c930e -[VKMapView initWithFrame:andGlobe:shouldRasterize:] + 642
15  MapKit                          0x33599320 -[MKMapView _commonInitAndEnableLoading:fromIB:] + 720
16  MapKit                          0x33598e9c -[MKMapView initWithFrame:] + 252
17  saTest                          0x00017e2a -[AppleMapCtl loadView] (AppleMapCtl.m:27)
4

1 回答 1

4

在首次将 Google 地图集成到我们的 iOS 应用程序后,我们遇到了同样的问题。到目前为止似乎对我们有用的解决方案是在释放 GMSMapView 和所有相关的 Google Maps 对象之后等待一段时间,然后再实例化任何 MapKit 对象。

根据我们迄今为止的测试,我们的想法是 GMSMapView 对象层次结构是异步释放的,并且在释放 OpenGL 资源之前似乎没有积极地将其 EAGLContext 重新建立为“当前”。因此,如果 MapKit 切换当前 EAGLContext,则 GMSMapView 层次结构继续释放资源,您将获得 OpenGL 资源释放的交叉授粉。

所以我们的步骤是:

  1. 释放 GMSMapView,以及所有 GMS 相关的对象
  2. 等待 100 毫秒(0.1 秒)
  3. 将 EAGLEContext 设置为 nil
  4. 分配 MKMapView 并继续。

到目前为止,这对我们有用。祝你好运。

于 2013-03-15T21:31:04.710 回答