最近使用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%以上。
這是目前找到的處理方式,如果哪位朋友有更好的方式,可以出來分享,共同學習。