【问题标题】:iOS 6 MKMapView Memory Leak and Crashes app after some time一段时间后,iOS 6 MKMapView 内存泄漏和崩溃应用程序
【发布时间】:2026-01-06 13:45:01
【问题描述】:

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

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

1.5MB -->40-60MB(我用仪器查过漏洞,但没用)

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

【问题讨论】:

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


    【解决方案1】:

    这是因为 MKMapView 的工作方式。有一个操作挂起,所以 MapKit 保留了 MKMapView,它实际上还没有被释放。这本身不是问题。问题是它仍在向您的委托发送消息。

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

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

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

    编辑:也给 Oscar 一个赞成票,就在下方,谁在这里提供了文档报价。

    鉴于 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];
    }
    

    【讨论】:

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