从 MapView 释放内存

问题描述

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

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

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

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

删除了地图,我的记忆恢复到 20mbs,正常。但是这是释放内存的正确方法?以及按下按钮后如何取回它?。

解决方法

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

导入 UIKit 导入 MapKit

class ViewController: 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;
                
    }
        }
    }
}