iOS MKMapView Memory Leak

最近使用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%以上。

這是目前找到的處理方式,如果哪位朋友有更好的方式,可以出來分享,共同學習。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章