title: 百度地图经常崩溃的问题
date: 2015-11-14 11:23:45
categories: IOS
tags: 地图无忧
小小程序猿
我的博客:http://daycoding.com
问题:
百度地图文档上说是要在使用地图的viewController的声明周期函数中调用以下方法:
(void)viewWillAppear:(BOOL)animated
{
[_mapView viewWillAppear];
_mapView.delegate = self; // 此处记得不用的时候需要置nil,否则影响内存的释放
}
-(void)viewWillDisappear:(BOOL)animated
{
[_mapView viewWillDisappear];
_mapView.delegate = nil; // 不用时,置nil
}
项目需求:
开启协同长连接,接收web传来的操作,并在地图上进行操作,但是如果不在地图mapview所在的controller中就无法使用mapview的回调函数(例如:创建Annotation),所以我在mapviewcontroller的-(void)viewWillDisappear:(BOOL)animated
中注释了_mapView.delegate = nil;
这句话,这样如果接收到web传来的操作就会在地图上进行绘制。
但是如此操作几次,当从其他controller跳转到mapViewController的时候程序会经常报同样的错
日志:
frame #0: 0x3239c5b8 GLEngine`gleRunVertexSubmitARM + 1804
frame #1: 0x3239a40a GLEngine`gleSetVertexArrayFunc + 118
frame #2: 0x32357066 GLEngine`gleDrawArraysOrElements_ExecCore + 666
frame #3: 0x32355de8 GLEngine`glDrawElements_ACC_Exec + 468
frame #4: 0x00b98b86 libglInterpose.dylib`draw_elements(__GLIContextRec*, unsigned int, int, unsigned int, void const*) + 234
frame #5: 0x323d7f92 OpenGLES`glDrawElements + 38
frame #6: 0x0044c5f8 MPC`_baidu_framework::CGridLayer::DrawGridSurface(_baidu_framework::GridDrawLayerMan*, _baidu_framework::GridDrawObj*, _baidu_framework::CMapStatus&) + 308
frame #7: 0x0044ae4e MPC`_baidu_framework::CGridLayer::Draw(_baidu_framework::CMapStatus&, _baidu_framework::DRAW_TYPE) + 726
frame #8: 0x004c3d70 MPC`_baidu_framework::CVMapControl::Draw() + 344
frame #9: 0x00461394 MPC`-[MapController draw] + 68
frame #10: 0x00463f3c MPC`__20-[MapView drawFrame]_block_invoke + 812
在网上查找答案和百度官方文档上说明,大部分的解释是说要在当前显示的controller中进行openGL的画图操作,百度文档也有类似说明:
//app在前后台切换时,需要使用下面的代码停止地图的渲染和openGL的绘制:
- (void)applicationWillResignActive:(UIApplication *)application {
[BMKMapView willBackGround];//当应用即将后台时调用,停止一切调用opengl相关的操作
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
[BMKMapView didForeGround];//当应用恢复前台状态时调用,回复地图的渲染和opengl相关的操作
}
所以分析原因是和我注释掉得代码有关系,将注释去掉,判断当前controller状态,将接收到的web操作放到任务队列当中,当controller调用方法(void)viewWillAppear:(BOOL)animated
的时候开始处理任务队列来完成项目需求