52

有没有其他人在他们的 iOS 6 应用程序中使用地图,注意到内存使用量极高,以至于一遍又一遍地收到内存警告,甚至导致应用程序崩溃?

我已经通过仪器运行了该应用程序,并且没有看到任何泄漏,并且在创建地图视图之前,该应用程序始终以大约 3mb 的实时字节运行。创建地图并下载图块后,Live Bytes 会跃升至 ~13mb Live Bytes。然后,当我四处移动地图并放大和缩小 Live Bytes 时,Live Bytes 会不断攀升,直到应用程序在大约 40mb Live Bytes 处崩溃。顺便说一句,这是在 iPhone 4 上。在 iPod touch 上,它崩溃得更早。

我正在正确地重用注释视图,并且没有任何泄漏。其他人在新的 iOS 6 地图中看到同样的高内存使用情况吗?另外,有人有解决办法吗?

4

12 回答 12

23

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

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

  • 我还发现一旦收到内存警告,iOS 6 地图就可以很好地处理释放内存。是的,它在缩放和平移时确实会消耗更多内存,但似乎对内存警告做出了适当的响应。

  • 我要做的最后一件事是减少我的整体初始内存占用。我注意到我开始的时候比我预期的要高,所以这也导致了我收到的与记忆有关的崩溃。一旦我降低了初始占用空间,让 MKMapView 在内存警告期间处理释放它的内存,并确保我只有 1 个 MKMapView 实例可以在整个应用程序中重用,一切运行良好。

于 2013-01-07T14:42:20.887 回答
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;
}

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

我尝试过但没有显着效果的其他事情:

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

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

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

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

于 2012-10-20T07:37:45.813 回答
7

我遇到同样的问题。

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

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

于 2012-10-10T07:21:30.180 回答
7

这个问题在 iOS 9 中仍然存在——除非你这样做。

使用故事板中设置的地图视图与视图控制器进行切换会在大约 10-15 个显示和关闭周期后导致崩溃(对我而言)。

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

override func viewDidDisappear(animated: Bool) {
    super.viewDidDisappear(animated)
    mapView.removeFromSuperview()
}

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

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

于 2015-09-06T10:17:24.640 回答
5

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

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

仍在努力放下bi ***。

于 2012-10-02T01:58:33.407 回答
5

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

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

即使这种变化只是几分之一秒。

于 2012-10-11T00:41:15.640 回答
3

我有同样的感觉,不知道怎么做releasememory即使MKMapView不使用。

我已经发布了控制器,MKMapView容器视图...memory仍在使用。

不要记得MKMapView在 iOS5 中使用 old 来体验这个。

于 2012-10-03T12:59:21.303 回答
3
- (void)applyMapViewMemoryHotFix{

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

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

            break;
        default:
            break;
    }


    self.mapView.mapType = MKMapTypeStandard;



}
-(void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
{
    [self applyMapViewMemoryHotFix];
}
于 2014-10-15T22:42:34.087 回答
2

For those journerying here in 2014+ (iOS8 and up)

I am running into this problem on iOS 7+ trying to support older devices (think Ipad 2 with 512MB).

My solution is to disable Zoom as it easily takes the most memory.

   long mem = [NSProcessInfo processInfo].physicalMemory;
    if(mem < _memory_threshold){
        self.MapView.zoomEnabled = NO;
    }

I have tried everything from switching map types, to deallocating the map, setting the delegate to nil, removing all overlays, annotations etc.

None of that works on iOS7+. In fact, most of these fixes cause jumps in memory, as MKMapView seems to leak and never properly dealloc (I have verified through sub-classing that I see dealloc hit).

This sucks, but all I have came up with so far is disabling map features (zoom, scroll, user interactions) as a means to limit the atrocious amount of memory MKMapView takes. This has resulted in my App at the very least being semi-stable on older devices.

于 2014-11-11T21:17:20.830 回答
2

我收到同样的问题 -

我对此并不完全确定,但新的苹果地图是否会预加载一大块地图以适应离线导航?

如果您在地图加载后关闭连接,然后尝试放大所需位置附近的区域,那么似乎仍然有很多细节可用。

于 2012-11-19T16:11:36.517 回答
1

不确定后果。

每当视图消失时,如何将 map 设置为“nil”,帮助我将内存使用量从 ~250MB 减少到 ~50-60MB。

-(void)viewDidDisappear:(BOOL)animated
{
     self.map = nil; 
}
于 2014-11-05T06:38:06.837 回答
-1

只有以下几行足以解决内存问题:

对于 Objective-C:

- (void) applyMapViewMemoryFix {
  [self.mkMapView removeFromSuperview];
  self.mkMapView = nil;}

对于 Swift 3.0:

func applyMapViewMemoryFix() {
    mapView.removeFromSuperview()
    self.mapView = nil
}
于 2018-03-26T12:24:13.893 回答