应用程序在打开和关闭几次时会在地图屏幕上崩溃。 (主要是第6次尝试)
继承自GMSMapView
的类
class AirportMapView: GMSMapView , AirportMapViewProtocol{
weak var airportMapViewModuleDelegate: AirportMapViewModuleProtocol?
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override init(frame: CGRect) {
super.init(frame: frame)
}
convenience init(from frame: CGRect, with cameraPosition: GMSCameraPosition) {
self.init(frame: frame)
self.camera = cameraPosition
}
func setCluster() {
let algorithm = CustomGoogleMapsClusteringAlgorithm.init();
mapIconGenerator = VJAirportIconGrayClusterGenerator.init()
let renderer = VJGoogleMapsClusterRenderer(mapView: self,
clusterIconGenerator: mapIconGenerator!)
clusterManager = GMUClusterManager.init(map: self, algorithm: algorithm, renderer: renderer)
clusterManager?.setDelegate(self, mapDelegate: self)
}
}
在ViewController viewDidLoad
中,我调用了mapView的init
方法
self.mapView = [[AirportMapView alloc] initFrom:frame with:camera];
self.mapView.myLocationEnabled = YES;
self.mapView.settings.compassButton = YES;
self.mapView.settings.zoomGestures = YES;
self.mapView.airportMapViewModuleDelegate = self;
附加的崩溃和控制台日志的Backtrace
观察:
GMUClusterManager
initWithMap
方法,如果我删除addObserver
代码应用程序没有崩溃在检查了Google-Maps-iOS-Utils源代码之后,事实证明GMSClusterManager
类没有保持对它通过KVO观察到的GMSMapView
的强烈参考。如果在从GMSMapView
调用removeObserver:forKeyPath:
方法之前dealloc
对象已经解除分配,这可能会导致崩溃。
根据Apple documentation,应保留通过KVO观察到的物体的强引用:
注意:键值观察addObserver:forKeyPath:options:context:方法不保持对观察对象,观察对象或上下文的强引用。您应该确保在必要时保持对观察,观察对象和上下文的强引用。
有关详细信息,请参阅this pull request(现已合并)。
我在自定义UIView子类中遇到了类似的问题,然后是GMSMapView
var mapView: GMSMapView!
var clusterManager: GMUClusterManager!
在GMUClusterManager中dealloc之前被解除分配,这导致崩溃,因为在调用removeObserver之前mapView将变为nil所以我添加了
deinit {
clusterManager = nil
}
到我的UIView子类
检查这个线程https://github.com/googlemaps/google-maps-ios-utils/issues/181#issuecomment-385531638