You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS开发中如何正确释放GMSMapView以避免内存泄漏?

GMSMapView内存泄漏完全卸载解决方案

问题根因为清理逻辑触发时机错误,叠加Google Maps iOS SDK内部对地图实例存在额外持有逻辑,导致GMSMapView实例无法正常释放,可按以下步骤修复:

  • 第一步:调整清理逻辑的触发时机
    viewDidDisappear会在所有页面消失场景触发(包括临时push新页面、切后台、present其他半页页面等),不适合执行销毁逻辑。将清理代码迁移到当前控制器的deinit方法中,确保只有控制器真的要被销毁时才执行地图清理:
    deinit {
        print("DEINIT ME")
        // 先关闭所有地图相关功能开关,解除SDK内部持有
        map?.isMyLocationEnabled = false
        map?.settings.allGesturesEnabled = false
        map?.settings.compassButton = false
        map?.settings.myLocationButton = false
        // 执行原有清理逻辑
        map?.delegate = nil
        map?.clear()
        map?.removeFromSuperview()
        map = nil
    }
    
  • 第二步:排查全局强引用
    检查项目中是否有其他对象、闭包强引用了当前的map实例:如果在闭包中使用过map,需要在闭包捕获列表中添加[weak map]或者[weak self],避免闭包长期持有地图实例。
  • 第三步:更换初始化方式(适配顽固泄漏场景)
    如果上述操作后仍然存在泄漏,建议放弃Storyboard关联GMSMapView的方式,改为代码手动创建地图实例,完全控制视图生命周期:
    1. 删除Storyboard中的GMSMapView控件以及对应的IBOutlet关联
    2. 在控制器中声明地图属性:
    private weak var map: GMSMapView?
    
    1. 在viewDidLoad中手动创建并添加地图:
    override func viewDidLoad() {
        super.viewDidLoad()
        let mapView = GMSMapView(frame: view.bounds)
        mapView.delegate = self
        mapView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        view.addSubview(mapView)
        self.map = mapView
        // 后续地图配置逻辑
    }
    

内容的提问来源于stack exchange,提问作者tePoloN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 16:18:03