分配mapView时随机KVO块崩溃,仅在打开/关闭屏幕几次时才会发生

问题描述 投票:1回答:2

应用程序在打开和关闭几次时会在地图屏幕上崩溃。 (主要是第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

enter image description here

enter image description here

Backtrace of the crash

观察:

  • GMUClusterManager initWithMap方法,如果我删除addObserver代码应用程序没有崩溃
swift google-maps-sdk-ios gmsmapview google-maps-ios-utils
2个回答
1
投票

在检查了Google-Maps-iOS-Utils源代码之后,事实证明GMSClusterManager类没有保持对它通过KVO观察到的GMSMapView的强烈参考。如果在从GMSMapView调用removeObserver:forKeyPath:方法之前dealloc对象已经解除分配,这可能会导致崩溃。

根据Apple documentation,应保留通过KVO观察到的物体的强引用:

注意:键值观察addObserver:forKeyPath:options:context:方法不保持对观察对象,观察对象或上下文的强引用。您应该确保在必要时保持对观察,观察对象和上下文的强引用。

有关详细信息,请参阅this pull request(现已合并)。


0
投票

我在自定义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

© www.soinside.com 2019 - 2024. All rights reserved.