iOS6的MKMapView使用了大量的内存,到崩溃的应用程序,任何人注意到这一点?
有没有其他人在iOS 6应用程序中使用地图,注意到内存使用率非常高,以至于接收内存警告一直到崩溃的程度?
我已经通过仪器运行应用程序,我没有看到任何泄漏,直到地图视图创build应用程序一直运行约3mb的现场字节。 一旦地图被创build并且瓦片被下载,实时字节跳跃到~13mb实时字节。 然后,当我移动地图,放大和缩小实时字节连续攀登,直到应用程序崩溃约40MB的现场字节。 顺便说一句,这是在iPhone 4上。 在iPod touch上,甚至更早崩溃。
我正在重复使用注释视图,没有任何泄漏。 有没有人看到与新的iOS 6地图相同的高内存使用率? 另外,有没有人有一个解决scheme?
经过大量的testing和testing不同的想法,其中一些在这里提到,最终的解决scheme,为我工作如下。
-
我没有根据需要在应用程序中创build新的MKMapView,而是将一个mkMapView属性添加到我的AppDelegate中,并仅在需要时创build它。 一旦创build完成,它将永远驻留在AppDelegate中,并在任何需要的地方重复使用该单一实例。 这真的有助于减less正在使用的内存量,因为我之前实例化了几个不同的MKMapView,并且都快速地通过内存烧毁。
-
我还发现,一旦接收到内存警告,iOS 6 Maps就能很好地处理释放内存。 是的,它在缩放和平移时会消耗更多的内存,但似乎正在响应内存警告。
-
我必须做的最后一件事是减less我的整体初始内存占用量。 我注意到我开始的时候比我想象中的要高,这也是导致我记忆相关的崩溃的原因。 一旦我得到了最初的脚印,让MKMapView在内存警告期间释放它的内存,并确保我只有1个MKMapView的实例,我可以在整个应用程序中重用,一切都运行良好。
我也有这个问题,它使我疯狂。 试图找出一个基于mateo的post的修补程序,这是我想出了:
- (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; }
我不知道为什么,但从超视图,然后设置为零的组合,真的减less了内存使用情况。 我在控制器的viewDidDisappear中调用这个方法。
我尝试过的其他东西,但没有显着的效果
1)围绕mkMapView的alloc init创buildautoreleasepool
2)设置在纬度84 lon -30左右的显示区域,因为我认为在北极的vector信息可能不像密集…然而,没有帮助;)
这个问题是非常严重的,并导致我们的应用程序不稳定,并在iOS 6中导致大量的内存警告。当然,希望苹果发布一个比我更好的修补程序…很快!
请批评我的修补程序,并提出更有效的方法来减less地图的内存使用情况。 谢谢!
我遇到同样的问题。
内存永远不会放大和改变位置后释放。
我发现的唯一技巧是在内存警告后更改地图types。
这个问题仍然存在于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的增量,并且不去下!)
无论如何,我不再使用MapOut的IBOutlet,而是在代码中创build所有的东西。 新的足迹现在是:2.48; 19.48; 38.42; 12.54。
还在努力把双bi下来。
不是一个解决scheme,而是一个伎俩
…更改mapType => mapkit释放内存。
即使这种变化是一秒钟的一小部分。
我有同样的感觉,不知道如何release
这个memory
,即使没有使用MKMapView
。
我已经释放控制器, MKMapView
,容器视图… memory
仍然使用。
不要记得在iOS5中使用旧的MKMapView
。
我收到同样的问题 –
我对此并不完全确定,但是新的苹果地图能否预载大量的地图以适应离线导航?
如果您在加载地图后closures连接,请尝试放大远离所需位置的地方,然后看起来还有很多可用的细节。
- (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年(iOS8及以上)
我在iOS 7+上遇到了这个问题,试图支持旧设备(想象一下512MB的Ipad 2)。
我的解决scheme是禁用缩放,因为它容易占用最多的内存。
long mem = [NSProcessInfo processInfo].physicalMemory; if(mem < _memory_threshold){ self.MapView.zoomEnabled = NO; }
我尝试了从切换地图types到释放地图,将代理设置为零,删除所有覆盖图,注释等等。
这些在iOS7 +上都不起作用。 实际上,这些修复中的大部分会导致内存中的跳转,因为MKMapView似乎泄漏并且从未正确释放(我已通过子分类validation了我看到dealloc命中)。
这很糟糕,但是到目前为止,我所想的都是禁用地图function(缩放,滚动,用户交互),以限制MKMapView占用的大量内存。 这导致我的应用程序在旧设备上至less是半稳定的。
不确定的后果。
当视图消失的时候,如何将地图设置为'nil',帮助我将内存使用量从〜250MB降低到〜50〜60MB。
-(void)viewDidDisappear:(BOOL)animated { self.map = nil; }