我已经注意到我的应用程序会泄漏内存,但是如果我把MKMapView去掉,内存问题就会消失。
为了测试这个理论,我做了一个非常简单的项目,它有一个视图,它推送一个带有MKMapView的视图,并弹出和推送。没别的了。视图控制器中没有代码,所有的事情都是通过故事板完成的。
如果我来回回到地图视图,在推送和弹出包含地图的视图后,它启动了大约3MB,这大约是内存的15倍,大约是230MB。
还有人看过这个吗?看起来是个很大的bug。有没有一种不同的方式来使用MKMapView来防止它泄露这么多?

发布于 2014-08-21 14:41:38
我也遇到过同样的问题,(感谢Stackoverflow)通过更改viewWillDisappear中的MKMapType并将其委托解除分配/设置为nil.As来修复它,但它仍然会向委托发送消息。MKMapViewDelegate协议参考中记录了这一点:
在释放已为其设置委托的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;
}希望这能有所帮助
发布于 2015-06-04 22:38:00
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
case MKMapType.standard:
self.mapView.mapType = MKMapType.hybrid
default:
break
}
self.mapView.showsUserLocation = false
self.mapView.delegate = nil
self.mapView.removeFromSuperview()
self.mapView = nil
}发布于 2015-09-24 18:20:40
我找到的最好的解决方案是在你的委托中有一个MKMapView的实例,你只需要分配它一次。
然后,当你需要一个MapView时,你只需要使用委托中的那个。
在我的例子中,我需要在视图willDisappear时立即清除其中的注释(这样地图上就不会有较旧的注释)。
- (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];
}
}https://stackoverflow.com/questions/20138419
复制相似问题