最近修改一个用到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。