一段时间后iOS 6 MKMapView内存泄漏和崩溃应用程序

时间:2013-04-10 10:09:47

标签: map memory-leaks crash mkmapview ios6-maps

iOS 6 MKMapView似乎使用了大量的内存,当我们在我们的应用程序中开始缩放和使用Map View时(约7-10分钟),当我们走出具有MKMapView的控制器时,一些如何不释放总内存(我在我的应用程序中使用ARC)。我正在通过NIB分配和初始化MKMapView。

控制器1 - >控制器2(具有MKMapView)

1.5MB - > 40-60MB(我已经使用仪器查找泄漏,但没有用)

当我回到Controller1时,实时字节似乎是7-10MB,每次访问控制器2后,Live Bytes中有大约2-3MB的增量,经过一段时间它会崩溃应用程序,在控制台中说“收到内存警告”。请帮忙吗?如果您需要更多信息,请告诉我。在此先感谢。

1 个答案:

答案 0 :(得分:4)

这是因为MKMapView的工作方式。有一个挂起的操作,所以MapKit保留了MKMapView,它实际上还没有被解除分配。这本身不是问题。问题是它仍在向你的代表发送消息。

解决方法很简单:作为视图控制器清理的一部分,将地图视图的委托设置为nil,这将阻止MKMapView向其发送消息。

这在MKMapViewDelegate协议参考:

中有记载

在发布已设置委托的MKMapView对象之前,请记住将该对象的委托属性设置为nil。您可以在dealloc方法中处理地图视图。

编辑:给Oscar一个upvote,就在下面,谁在这里提供了文档引用。

鉴于ARC,我建议这意味着您应该在视图控制器的dealloc中将地图视图的委托设置为nil。

你可以做一些这样的事情来解决我的问题。更改地图类型也有帮助。

- (void)applyMapViewMemoryHotFix{

switch (self.mapView.mapView.mapType) {
    case MKMapTypeHybrid:
    {
        self.mapView.mapView.mapType = MKMapTypeStandard;
    }

        break;
    case MKMapTypeStandard:
    {
        self.mapView.mapView.mapType = MKMapTypeHybrid;
    }

        break;
    default:
        break;
}
self.mapView.showsUserLocation = NO;
self.mapView.delegate = nil;
[self.mapView removeFromSuperview];
self.mapView = nil;
}

-(void)viewDidDisappear:(BOOL)animated
{
    [self applyMapViewMemoryHotFix];
}