从 MapView 释放内存
Releasing Memory from MapView
在我的项目中,我使用 mapView 渲染从 API 接收到的 Lat-Lon 的位置。我的项目有一个执行以下操作的按钮:
- 点击后,它会触发一个计时器,从网络上检索坐标,然后在地图视图上绘制
- 再次单击时,它会停止计时器并且不会检索任何数据。
然而,即使计时器停止,它也会消耗大量内存,大约 100mbs,甚至更多。所以我想在用户不使用地图时释放内存,而当他们使用地图时应该再次使用。我做了以下释放内存:
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;
}
}
}
}
在我的项目中,我使用 mapView 渲染从 API 接收到的 Lat-Lon 的位置。我的项目有一个执行以下操作的按钮:
- 点击后,它会触发一个计时器,从网络上检索坐标,然后在地图视图上绘制
- 再次单击时,它会停止计时器并且不会检索任何数据。
然而,即使计时器停止,它也会消耗大量内存,大约 100mbs,甚至更多。所以我想在用户不使用地图时释放内存,而当他们使用地图时应该再次使用。我做了以下释放内存:
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;
}
}
}
}