iOS MKMapView Memory Leak

版权声明:本文为博主原创文章,未经博主允许不得转载。 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,可以防止重复创建所产生的叠加内存泄露。
两种写法:

  1. 在 AppDelegate 里创建MKMapView;
  2. 使用静态变量:

    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%以上。

这是目前找到的处理方式,如果哪位朋友有更好的方式,可以出来分享,共同学习。

猜你喜欢

转载自blog.csdn.net/rigel_xu/article/details/52146774