首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >阻止iOS 7 MKMapView内存泄漏

阻止iOS 7 MKMapView内存泄漏
EN

Stack Overflow用户
提问于 2013-11-22 14:25:44
回答 3查看 11.5K关注 0票数 33

我已经注意到我的应用程序会泄漏内存,但是如果我把MKMapView去掉,内存问题就会消失。

为了测试这个理论,我做了一个非常简单的项目,它有一个视图,它推送一个带有MKMapView的视图,并弹出和推送。没别的了。视图控制器中没有代码,所有的事情都是通过故事板完成的。

如果我来回回到地图视图,在推送和弹出包含地图的视图后,它启动了大约3MB,这大约是内存的15倍,大约是230MB。

还有人看过这个吗?看起来是个很大的bug。有没有一种不同的方式来使用MKMapView来防止它泄露这么多?

EN

回答 3

Stack Overflow用户

发布于 2014-08-21 14:41:38

我也遇到过同样的问题,(感谢Stackoverflow)通过更改viewWillDisappear中的MKMapType并将其委托解除分配/设置为nil.As来修复它,但它仍然会向委托发送消息。MKMapViewDelegate协议参考中记录了这一点:

在释放已为其设置委托的MKMapView对象之前,请记住将该对象的

属性设置为nil。您可以在dealloc方法中执行此操作,在该方法中可以处理地图视图

代码语言:javascript
复制
-(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;
}

希望这能有所帮助

票数 17
EN

Stack Overflow用户

发布于 2015-06-04 22:38:00

Swift版本:

代码语言:javascript
复制
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
}
票数 5
EN

Stack Overflow用户

发布于 2015-09-24 18:20:40

我找到的最好的解决方案是在你的委托中有一个MKMapView的实例,你只需要分配它一次。

然后,当你需要一个MapView时,你只需要使用委托中的那个。

在我的例子中,我需要在视图willDisappear时立即清除其中的注释(这样地图上就不会有较旧的注释)。

代码语言:javascript
复制
  - (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];
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20138419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档