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实例,我可以在整个应用程序中重用,一切运行正常.
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 9中 - 除非您这样做.
使用已在故事板中设置的地图视图的视图控制器进行查看会导致在大约10-15个显示和解除周期后发生崩溃(对我而言).
现在看起来修复很简单.添加这个
override func viewDidDisappear(animated: Bool) {
super.viewDidDisappear(animated)
mapView.removeFromSuperview()
}
Run Code Online (Sandbox Code Playgroud)
似乎已经解决了问题,可以循环往返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***.