停止iOS 7 MKMapView从内存泄漏

我注意到我的应用程序泄漏内存,但如果我把MKMapView出内存问题消失。

为了testing这个理论,我做了一个简单的死了的项目,这个项目有一个视图,用一个MKMapView在视图中popup并popup并推送。 而已。 在视图控制器没有代码,通过故事板完成。

如果我来回地图视图,它开始大约3MB后,推动和popup视图与地图在这个约15倍的内存是230MB左右。

其他人看到这个? 看起来像一个很大的错误。 有没有一种不同的方式来使用MKMapView ,以防止泄漏这么多?

在这里输入图像说明

我遇到了同样的问题,(感谢Stackoverflow)通过在viewWillDisappear更改MKMapType并取消分配/将其委托设置为nil来修复它。因为它仍然向委托发送消息。 这在MKMapViewDelegate协议参考中有logging:

在释放已设置委托的MKMapView对象之前,请记住将该对象的委托属性设置为nil。 一个你可以做的地方是在你处理地图视图的dealloc方法中

 -(void)viewWillDisappear:(BOOL)animated{ [super viewWillDisappear:animated]; [self applyMapViewMemoryFix]; } - (void)applyMapViewMemoryFix{ switch (self.mkMapView.mapType) { case MKMapTypeHybrid: { self.mkMapView.mapType = MKMapTypeStandard; } break; case MKMapTypeStandard: { self.mkMapView.mapType = MKMapTypeHybrid; } break; default: break; } self.mkMapView.showsUserLocation = NO; self.mkMapView.delegate = nil; [self.mkMapView removeFromSuperview]; self.mkMapView = nil; } 

希望这可以帮助

我发现最好的解决scheme是在你的委托中有一个MKMapView的实例,你只能分配一次。

然后,无论何时您需要一个MapView,只需使用委托中的一个即可。

在我的情况下,我需要从视图中清除注释,一旦视图将会消失(在地图上没有旧注释)。

  - (void)viewDidLoad { AppDelegate *delegate = [UIApplication sharedApplication].delegate; if (!delegate.appModel.mapView) delegate.appModel.mapView = [[MKMapView alloc] initWithFrame:self.view.frame]; self.mapView = delegate.appModel.mapView; [self.mapView setFrame:self.view.frame]; [self.mapView setDelegate:self]; [self.view addSubview:self.mapView]; } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [self.mapView removeAnnotations:self.mapView.annotations]; for (id<MKOverlay> overlay in self.mapView.overlays) { [self.mapView removeOverlay:overlay]; } } 

Swift版本:

 override func viewWillDisappear(animated:Bool){ super.viewWillDisappear(animated) self.applyMapViewMemoryFix() } func applyMapViewMemoryFix(){ switch (self.mapView.mapType) { case MKMapType.Hybrid: self.mapView.mapType = MKMapType.Standard break; case MKMapType.Standard: self.mapView.mapType = MKMapType.Hybrid break; default: break; } self.mapView.showsUserLocation = false self.mapView.delegate = nil self.mapView.removeFromSuperview() self.mapView = nil }