版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/rigel_xu/article/details/52146774
最近使用MKMapView,发现有内存泄露。经查发现属iOS系统 bug,参见
http://stackoverflow.com/questions/16420018/memory-not-being-released-for-mkmapview-w-arc
http://stackoverflow.com/questions/26463125/memory-leak-in-mapkit-ios8
尽管如此还是有一些方式可以优化。
一、使用同一个MKMapView
因为每次创建一个 MKMapView,都会产生很多的内存泄露(具体要看操作的频次),所以如果整个 app只 holding 一个MKMapView,可以防止重复创建所产生的叠加内存泄露。
两种写法:
- 在 AppDelegate 里创建MKMapView;
使用静态变量:
static MKMapView *_mapView = nil;
if (!_mapView) { _mapView = [[MKMapView alloc] init]; } else { [_mapView removeAnnotations:_mapView.annotations]; }
二、尽可能释放内存:
如果MKMapView在 View 里,可以按如下方式优化。经测退出时地图所耗内存减少部分,大概有1/3:
- (void)dealloc {
switch (self.mapView.mapType) {
case MKMapTypeHybrid:
{
self.mapView.mapType = MKMapTypeStandard;
}
break;
case MKMapTypeStandard:
{
self.mapView.mapType = MKMapTypeHybrid;
}
break;
default:
break;
}
self.mapView.mapType = MKMapTypeStandard;
_mapView.showsUserLocation = NO;
[_mapView.layer removeAllAnimations];
[_mapView removeAnnotations:_mapView.annotations];
[_mapView removeOverlays:_mapView.overlays];
[_mapView removeFromSuperview];
_mapView.delegate = nil;
_mapView = nil;
}
以下是我写的 Demo测试情况,MKMapView添加到 ViewController,然后 push 进去。
下载 Demo:http://download.csdn.net/detail/rigel_xu/9597644
打开地图前:
打开地图时:
关闭地图后:
另外,假如已退出地图界面,如果app收到内存警告,iOS会把MKMapView占用的内存部分回收, 可以达到50%以上。
扫描二维码关注公众号,回复:
5291539 查看本文章
这是目前找到的处理方式,如果哪位朋友有更好的方式,可以出来分享,共同学习。