问题描述
在我的项目中,我使用 mapView 来渲染从 API 接收到的 Lat-Lon 位置。我的项目有一个按钮,它执行以下操作:
- 点击时,它会触发一个计时器,从网络检索坐标,然后在地图视图上绘制
- 再次单击时,它会停止计时器并且不会检索任何数据。
然而,即使计时器停止,它也会消耗大约 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;
}
}
}
}