iOS6 MKMapView使用了大量的内存,到了崩溃的应用程序,其他人都注意到这一点?

Jer*_*Fox 52 memory memory-management mkmapview ios6 ios6-maps

有没有其他人,他们在iOS 6应用程序中使用地图,注意到极高的内存使用,一直到接收内存警告到崩溃的应用程序?

我通过仪器运行应用程序,我没有看到任何泄漏,直到创建地图视图,应用程序始终以大约3mb Live Bytes运行.创建地图并下载切片后,Live Bytes会跳至~13mb Live Bytes.然后,当我移动地图并放大和缩小Live Bytes连续体时,直到应用程序崩溃在大约40mb Live Bytes.顺便提一下,这是在iPhone 4上.在iPod touch上它甚至更早崩溃.

我正在重复使用注释视图,没有任何泄漏.是否有其他人在使用新的iOS 6地图时看到了相同的高内存使用量?还有,有没有人有解决方案?

Jer*_*Fox 23

经过大量的游戏和测试不同的想法,其中一些在这里提到,对我有用的最终解决方案如下.

  • 我没有在应用程序中根据需要创建新的MKMapView,而是向我的AppDelegate添加了一个mkMapView属性,并且只在需要时才创建它.一旦创建它,​​它永远存在于AppDelegate中,我在所需的任何地方重用该单个实例.这确实有助于减少使用的内存量,因为我之前实例化了几个不同的MKMapView,并且两者都很快地通过内存刻录.

  • 我还发现,一旦收到内存警告,iOS 6 Maps就能很好地释放内存.是的,它在缩放和平移时会耗尽更多内存,但似乎正在适当地响应内存警告.

  • 我要做的最后一件事就是减少我的整体初始内存占用量.我注意到我的起步比我预期的要高,这也导致了我收到的与内存有关的崩溃.一旦我得到初始足迹,让MKMapView处理在内存警告期间释放它的内存,并确保我只有一个MKMapView实例,我可以在整个应用程序中重用,一切运行正常.

  • 我不明白 在viewwilldisare中,您可以取消mapview并取消分配.你为什么要永远生活在记忆中的单身?.当我初始化内存跳转到40 MB.我清楚它在我的情况下减少了20 mb,即使我释放它.内存占用继续占据.剩下的20mb在哪里被占用?任何的想法 ? (3认同)

Wir*_*ing 21

我也有这个问题,它让我疯了.试图找出基于mateo帖子的修补程序,这就是我想出的:

- (void)applyMapViewMemoryHotFix{

    switch (self.mkMapView.mapType) {
        case MKMapTypeHybrid:
        {
            self.mkMapView.mapType = MKMapTypeStandard;
        }

            break;
        case MKMapTypeStandard:
        {
            self.mkMapView.mapType = MKMapTypeHybrid;
        }

            break;
        default:
            break;
    }

    [self.mkMapView removeFromSuperview];
    self.mkMapView = nil;
}
Run Code Online (Sandbox Code Playgroud)

我不知道为什么,但从superview中删除然后设置为nil的组合确实减少了内存使用量.我在控制器的viewDidDisappear中调用此方法.

我尝试过但没有显着影响的其他事情:

1)在mkMapView的alloc init周围创建autoreleasepool

2)设置显示区域在纬度84 lon -30附近,因为我认为北极的矢量信息可能不那么密集...但是,没有帮助;)

这个问题非常严重,导致我们的应用程序不稳定,并在iOS 6中引起大量的内存警告.当然希望Apple发布一个比我更好的修补程序......很快!

请批评我的修补程序,并提出更有效的方法来减少丢弃地图时的内存使用量.谢谢!

  • 据我所知,此修复在iOS 7中没有帮助.MKMapView导致非常严重的内存泄漏. (7认同)
  • 我删除了switch语句,只剩下最后两行,它似乎很好地清理了内存. (3认同)

小智 8

我遇到了同样的问题.

缩放和更改位置后永远不会释放内存.

我发现的唯一技巧是在内存警告后更改地图类型.


Dog*_*fee 7

此问题仍然存在于iOS 9中 - 除非您这样做.

使用已在故事板中设置的地图视图的视图控制器进行查看会导致在大约10-15个显示和解除周期后发生崩溃(对我而言).

现在看起来修复很简单.添加这个

override func viewDidDisappear(animated: Bool) {
    super.viewDidDisappear(animated)
    mapView.removeFromSuperview()
}
Run Code Online (Sandbox Code Playgroud)

似乎已经解决了问题,可以循环往返20多次,没有问题.没有崩溃!

希望这可以帮助.这是一个令人沮丧的问题,很高兴它解决了.


esl*_*ano 5

我的足迹是:2.48; 19.51; 49.64; 12.60这是:加载mapView之前的内存,加载mapView之后,放大/缩小一点之后,以及释放mapView之后(这很烦人,即使在释放mapView之后,我也保持10MB增量而且它不会去下!)

无论如何,我不再使用IBOutlet用于MapView,而是在代码中创建所有内容.新的足迹现在是:2.48; 19.48; 38.42; 12.54.

仍然致力于降低bi***.


小智 5

不是解决方案,而只是一个技巧......

...更改mapType => mapkit释放内存.

即使这种变化只是一秒钟.