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


Answers

我也有这个问题,它让我疯了。 试图找出基于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发布一个比我更好的修补程序......很快!

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

Question

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

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

我正在重复使用注释视图,没有任何泄漏。 有没有其他人看到与新的iOS 6地图相同的高内存使用率? 还有,有人有解决方案吗?




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

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

即使这种变化仅仅是一小部分。




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

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

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

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

似乎已经解决了问题,可以循环20次以上,没有问题。 没有崩溃!

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




对于2014年以上在这里(iOS8及以上)的人来说

我在iOS 7+上遇到这个问题试图支持旧设备(想想Ipad 2 512MB)。

我的解决方案是禁用Zoom,因为它可以轻松占用大部分内存。

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

我已尝试过从切换地图类型到解除分配地图,将委托设置为nil,删除所有叠加,注释等所有内容。

这些都不适用于iOS7 +。 事实上,大多数这些修复都会导致内存跳转,因为MKMapView似乎泄漏并且从未正确释放(我通过子类化验证了我看到dealloc命中)。

这很糟糕,但到目前为止我所提出的只是禁用地图功能(缩放,滚动,用户交互)作为限制MKMapView占用的内存量的手段。 这导致我的应用程序至少在旧设备上是半稳定的。




- (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];
}



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

对于Objective-C:

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

对于Swift 3.0:

func applyMapViewMemoryFix() {
    mapView.removeFromSuperview()
    self.mapView = nil
}



Related