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




mapkit (11)

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

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

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


Answers

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

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

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


对于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占用的内存量的手段。 这导致我的应用程序至少在旧设备上是半稳定的。


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

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

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

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

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

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


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

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

仍在努力降低bi ***。


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

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

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

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


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

对于Objective-C:

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

对于Swift 3.0:

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

我有同样的感觉,不知道如何release这个memory ,即使没有使用MKMapView

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

不记得在iOS5中使用旧的MKMapView体验这一点。


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

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

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


我遇到了同样的问题。

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

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


这取决于你的内存不足意味着什么。

malloc()在大多数系统上失败时,这是因为你已经用完了地址空间。

如果大部分内存是通过缓存或mmap'd区域获取的,则可以通过释放缓存或解除缓存来回收部分内存。 然而,这确实需要你知道你在用什么内存 - 而且你已经注意到大多数程序没有,或者它没有什么区别。

如果你对自己使用了setrlimit() (为了防止不受欢迎的攻击,也许,或者可能是root做了你),你可以放松你的错误处理程序的限制。 我经常这样做 - 如果可能的话提示用户并记录事件。

另一方面,捕捉堆栈溢出有点困难,并且不便携。 我为ECL写了一个posixish解决方案,并描述了一个Windows实现,如果你要走这条路线。 几个月前它被签入ECL,但如果你有兴趣,我可以挖掘原始的补丁。







memory memory-management mkmapview ios6 ios6-maps