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

iOS 6 MKMapView内存泄漏并在一段时间后使应用程序崩溃,map,memory-leaks,crash,mkmapview,ios6-maps,Map,Memory Leaks,Crash,Mkmapview,Ios6 Maps,iOS 6 MKMapView似乎正在使用大量内存,当我们开始在应用程序中缩放和播放地图视图大约7-10分钟时,当我们从拥有MKMapView的控制器中出来时,我在我的应用程序中使用ARC时,总内存是如何没有释放出来的。我正在通过NIB分配和初始化MKMapView 控制器1->控制器2具有MKMapView 1.5MB->40-60MB我已使用仪器查找泄漏,但没有任何用处 当我回到Controller1时,活动字节似乎是7-10MB,每次访问控制器2后,活动字节中大约有2-3MB的增量,在一段

iOS 6 MKMapView似乎正在使用大量内存,当我们开始在应用程序中缩放和播放地图视图大约7-10分钟时,当我们从拥有MKMapView的控制器中出来时,我在我的应用程序中使用ARC时,总内存是如何没有释放出来的。我正在通过NIB分配和初始化MKMapView

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

1.5MB->40-60MB我已使用仪器查找泄漏,但没有任何用处


当我回到Controller1时,活动字节似乎是7-10MB,每次访问控制器2后,活动字节中大约有2-3MB的增量,在一段时间后它使应用程序崩溃,在控制台中它说收到内存警告。有人能帮忙吗?如果你需要更多的信息,请告诉我。提前感谢。

这是因为MKMapView的工作方式。有一个操作挂起,因此MapKit保留了MKMapView,但实际上尚未解除分配。这本身不是问题。问题是它仍在向您的代理发送消息

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

这在MKMapViewDelegate协议参考中有记录:

在释放已设置委托的MKMapView对象之前,请记住将该对象的委托属性设置为nil。您可以在dealloc方法中执行此操作,在该方法中您可以处理地图视图

编辑:也给奥斯卡一个投票权,就在下面,谁在这里提供了文档引用

给定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];
}

这是因为MKMapView的工作方式。有一个操作挂起,因此MapKit保留了MKMapView,但实际上尚未解除分配。这本身不是问题。问题是它仍在向您的代理发送消息

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

这在MKMapViewDelegate协议参考中有记录:

在释放已设置委托的MKMapView对象之前,请记住将该对象的委托属性设置为nil。您可以在dealloc方法中执行此操作,在该方法中您可以处理地图视图

编辑:也给奥斯卡一个投票权,就在下面,谁在这里提供了文档引用

给定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];
}

谢谢Saad Ansari!!是的,我已经实施了热修复程序,并将mapview委托设置为nil,这有所改进,但在特定实例之后,它仍然会使我的应用程序崩溃!!谢谢Saad Ansari!!是的,我已经实施了热修复程序,并将mapview委托设置为nil,这有所改进,但在特定实例之后,它仍然会使我的应用程序崩溃!!