【问题标题】:Releasing Memory from MapView从 MapView 释放内存
【发布时间】:2021-09-17 17:48:45
【问题描述】:

在我的项目中,我使用 mapView 来呈现从 API 接收到的 Lat-Lon 位置。我的项目有一个按钮,它执行以下操作:

  1. 单击时,它会触发一个计时器,该计时器从网络检索坐标,然后在地图视图上绘图
  2. 再次单击时,它会停止计时器并且不会检索任何数据。

但是,即使计时器停止,它也会消耗大约 100mbs 的大量内存,如果不是更多的话。所以我想在用户不使用地图时释放内存,当他们使用地图时应该再次回来。我做了以下释放内存:

            self.mapView.delegate = nil;
            self.mapView.removeFromSuperview()
            self.mapView = nil;

这会删除地图,我的内存恢复到 20mbs,正常。然而这是释放内存的正确方法吗? 按下按钮后如何找回它

【问题讨论】:

  • 是的,这是正确的。 MapView 的资源非常繁重,这就是为什么它会消耗大量内存,因此如果您正在做一些繁重的事情,内存使用量增加 100+ Mb 是很正常的
  • @VisalRajapakse 好的,谢谢您的确认。一旦我做了self.mapView = nil。它删除了地图,之后我该如何取回它?
  • 你在使用Storyboards吗?如果是这样,删除 delegate 应该可以解决问题,因为 ARC 将为您完成剩下的工作。如果您以编程方式执行此操作,则可以在viewWillAppear(_:) 方法中的地图视图上使用addSubview(_:) 并在viewDidDisappear(_:) 中取消初始化地图视图。此外,如果您想确定您的 ViewController 已取消初始化,请添加带有嵌入式打印语句的 deinit() 方法。根据我的经验,阻止 Viewcontroller 被取消初始化的代表

标签: ios swift memory-management mkmapview


【解决方案1】:

要添加地图,您可以这样做

导入 UIKit 导入 MapKit

类视图控制器:UIViewController {

var mapView: MKMapView?

@IBOutlet weak var framer: UIView!//uiview to put map into

var coordinate = CLLocationCoordinate2D(){
    willSet{
        print("removing annotation...")
        if let m = mapView{
        m.removeAnnotation(anno)
        }
    }
    didSet{
        print("did set called, adding annotation...")
        
        anno.coordinate = coordinate
        if let m = mapView{
        m.addAnnotation(anno)
        }
    }
}

override func viewDidLoad() {

    
    super.viewDidLoad()        
}
    @IBAction func start(_ sender: Any) {
        let mk = MKMapView()
        
        mk.bounds = framer.bounds
        
        mk.mapType = MKMapType.standard
        mk.isZoomEnabled = true
        mk.isScrollEnabled = true
        
        // Or, if needed, we can position map in the center of the view
        mk.center = framer.center
        mapView = mk
        if let mk2 = mapView{
        framer.addSubview(mk2)
    }
}

删除

    @IBAction func stop(_ sender: UIButton) {
        
        if  mapView != nil{
            if let mk2 = mapView{
                mk2.delegate = nil;
                mk2.removeFromSuperview()
                mapView = nil;
                
    }
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    • 2011-05-10
    • 2014-02-14
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多