是否还有其他人在iOS 6应用程序中使用地图,注意到内存使用极高以至于一直接到内存警告而导致应用程序崩溃?
我通过乐器运行应用程序并且我没有看到任何泄漏,并且在创建地图视图之前,应用程序始终以约3mb Live Bytes运行。创建地图并下载切片后,Live Bytes会跳至~13mb Live Bytes。然后,当我移动地图并放大和缩小Live Bytes连续体时,直到应用程序崩溃在大约40mb Live Bytes。顺便提一下,这是在iPhone 4上。在iPod touch上它甚至更早崩溃。
我正在重复使用注释视图,没有任何泄漏。是否有其他人在使用新的iOS 6地图时看到了相同的高内存使用率?还有,有人有解决方案吗?
答案 0 :(得分:23)
经过大量的游戏和测试不同的想法,其中一些在这里提到,对我有用的最终解决方案如下。
我没有在应用程序中根据需要创建新的MKMapView,而是在我的AppDelegate中添加了一个mkMapView属性,并且只在需要时才创建它。一旦创建它,它永远存在于AppDelegate中,我在所需的任何地方重用该单个实例。这确实有助于减少使用的内存量,因为我之前实例化了几个不同的MKMapView,而且两者都很快就在内存中燃烧。
我还发现,一旦收到内存警告,iOS 6 Maps就会很好地释放内存。是的,它在缩放和平移时会耗尽更多内存,但似乎正在适当地响应内存警告。
我要做的最后一件事就是减少整体初始内存占用量。我注意到我的开始比我预期的要高,这也导致我收到的与内存有关的崩溃。一旦我得到初始足迹,让MKMapView在内存警告期间处理释放它的内存,并确保我只有一个MKMapView实例,我可以在整个应用程序中重复使用,一切运行正常。
答案 1 :(得分: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发布一个比我更好的修补程序......很快!!
请批评我的修补程序,并在丢弃地图时提出更有效的方法来减少内存使用量。谢谢!
答案 2 :(得分:8)
我遇到了同样的问题。
缩放和更改位置后,内存永远不会被释放。
我发现的唯一技巧是在内存警告后更改地图类型。
答案 3 :(得分:6)
iOS 9中仍然存在此问题 - 除非您这样做。
在一个故事板中设置的地图视图与视图控制器之间的争执导致在大约10-15个显示和解除周期后崩溃(对我而言)。
现在看起来修复很简单。添加此
override func viewDidDisappear(animated: Bool) {
super.viewDidDisappear(animated)
mapView.removeFromSuperview()
}
似乎已经解决了问题,可以循环往返20次以上,没有问题。没有崩溃!
希望这会有所帮助。这是一个令人沮丧的问题,很高兴它解决了。
答案 4 :(得分:5)
我的足迹是:2.48; 19.51; 49.64; 12.60这是:加载mapView之前的内存,加载mapView之后,放大/缩小一点之后,以及释放mapView之后(这很烦人,即使在释放mapView之后,我也保持10MB增量而且它不会去下来!)
无论如何,我不再使用IBOutlet用于MapView,而是在代码中创建所有内容。新的足迹现在是:2.48; 19.48; 38.42; 12.54。
仍在努力放下bi ***。
答案 5 :(得分:5)
不是解决方案,而只是一招......
...更改mapType => mapkit释放内存。
即使这种变化仅为几分之一。
答案 6 :(得分:3)
即使不使用release
,我也有同感,并且不知道如何memory
MKMapView
。
我已发布控制器,MKMapView
,容器视图... memory
仍在使用。
不要记得在iOS5中使用旧版MKMapView
来体验这一点。
答案 7 :(得分: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];
}
答案 8 :(得分:2)
我收到同样的问题 -
我对此并不完全确定,但可能是因为新的苹果地图会预先填充地图的大部分区域以满足离线导航的需要吗?
如果您在加载地图后关闭了连接,请尝试放大所需位置附近的区域,然后似乎仍有大量细节可供使用。
答案 9 :(得分:2)
对于2014年以上(iOS8及以上)
的人来说我在iOS 7+上遇到这个问题试图支持旧设备(想想Ipad 2 512MB)。
我的解决方案是禁用缩放,因为它可以轻松占用大部分内存。
long mem = [NSProcessInfo processInfo].physicalMemory;
if(mem < _memory_threshold){
self.MapView.zoomEnabled = NO;
}
我尝试过切换地图类型的所有,解除分配地图,将委托设置为nil,删除所有叠加层,注释等。
这些都不适用于iOS7 +。实际上,大多数这些修复都会导致内存跳转,因为MKMapView似乎泄漏并且从未正确解除dealloc(我已经通过子类化验证了我看到了dealloc命中)。
这很糟糕,但到目前为止我想出的只是禁用地图功能(缩放,滚动,用户交互)作为限制MKMapView占用的内存量的手段。这导致我的应用程序至少在旧设备上半稳定。
答案 10 :(得分:1)
不确定后果。
如何将地图设置为&nbsp&#39; nil&#39;每当视图消失时,帮助我将内存使用量从大约250MB减少到大约50-60MB。
-(void)viewDidDisappear:(BOOL)animated
{
self.map = nil;
}
答案 11 :(得分:-1)
只有以下行足以解决内存问题:
对于Objective-C:
- (void) applyMapViewMemoryFix {
[self.mkMapView removeFromSuperview];
self.mkMapView = nil;}
对于Swift 3.0:
func applyMapViewMemoryFix() {
mapView.removeFromSuperview()
self.mapView = nil
}