·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> app软件开发 >> IOS开发 >> iOS开发:MKMapView地图内存持续增加的释放解决办法

iOS开发:MKMapView地图内存持续增加的释放解决办法

作者:佚名      IOS开发编辑:admin      更新时间:2022-07-23

内存持续增加的释放解决办法

最近修改一个用到MKMapView的项目,内存一直占用过多,每次拖拽地图时还会增加占用,且一直无法释放。

经过两天的排查,最后锁定是创建的self.map对象在加载地图的时候,不断申请内存,但在View的生命期内不会释放。

查阅资料了解到removeFromSuperview可以释放内存,但remove的话地图会从父View上消失。

最后解决办法是在- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated中加入了两行代码

[self.map removeFromSuperview];
[self.view addSubview:mapView];

在移除self.map的同时,重新加载mapView,两行代码就可以达到释放内存的效果。

用Instruments测试显示,之前不能释放的内存可以释放了。下图中的Malloc 4.00MB 即为地图申请的内存,总共申请164M,释放132M后,程序平稳运行时的地图内存只需要28M。

 

后续: 大头针标注的点击事件会出现没有反应,怀疑是remove破坏了响应链,暂未找到解决办法。

 

地图缩放时出现错误提示

Terminating app due to uncaught exception 'NSGenericException',   
reason: '*** Collection was mutated while being enumerated.'

原因可能是线程冲突,解决办法是添加标记,避免同时对地图执行操作,可参考:
http://stackoverflow.com/questions/27273211/array-was-mutated-while-being-enumerated-swift