Ios 在iPhone上的谷歌地图上获取我的位置时崩溃

Ios 在iPhone上的谷歌地图上获取我的位置时崩溃,ios,objective-c,xcode,google-maps-sdk-ios,gmsmapview,Ios,Objective C,Xcode,Google Maps Sdk Ios,Gmsmapview,我给你写信是因为我遇到了一个非常奇怪的错误。 我尝试在我的应用程序中添加GMS,最后,当我必须获取设备位置时,我陷入了崩溃: 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因是:“GMSMapView类的实例0x7ff7fd82def0已解除分配,而键值观察员仍在向其注册。”。当前观测信息:( 上下文:0x0,属性:0x7ff7fdc2f470> 代码在此处初始化: self.mapView.myLocationEnabled = YES;

我给你写信是因为我遇到了一个非常奇怪的错误。 我尝试在我的应用程序中添加GMS,最后,当我必须获取设备位置时,我陷入了崩溃:

由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因是:“GMSMapView类的实例0x7ff7fd82def0已解除分配,而键值观察员仍在向其注册。”。当前观测信息:( 上下文:0x0,属性:0x7ff7fdc2f470>

代码在此处初始化:

self.mapView.myLocationEnabled = YES;
self.mapView.mapType = kGMSTypeNormal;
self.mapView.settings.compassButton = YES;
self.mapView.settings.myLocationButton = YES;

//=>    Listen to the myLocation property of GMSMapView.
[self.mapView addObserver:self
               forKeyPath:@"myLocation"
                  options:NSKeyValueObservingOptionNew
                  context:NULL];


- (void)observeValueForKeyPath:(NSString *)keyPath
                  ofObject:(id)object
                    change:(NSDictionary *)change
                   context:(void *)context
{
if ([keyPath isEqualToString:@"myLocation"] && [object isKindOfClass:[GMSMapView class]])
{   
    appDelegate().curUserLocation = [change objectForKey:NSKeyValueChangeNewKey];

    [self.mapView animateToCameraPosition:[GMSCameraPosition cameraWithLatitude:self.mapView.myLocation.coordinate.latitude
                                                                             longitude:self.mapView.myLocation.coordinate.longitude
                                                                                  zoom:15]];
}
}
但仍然没有成功。我在observerValueForKey方法中设置了断点,一旦从这里出来,就会出现崩溃。无法理解

我还删除了观察员:

- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];

[self.mapView removeObserver:self forKeyPath:@"myLocation"];

//=>    Set map delegate to nil (to avoid:   mapView:regionDidChangeAnimated:]: message sent to deallocated instance )
self.mapView.delegate = nil;
self.mapView = nil;
}
没有成功

有人能帮我吗?我尝试了所有可能的解决办法,但没有办法


提前感谢!

如何在评论中说..GMSMapView必须是
Strong
如果不在使用授权时调用
requestwhenuseauthorization

我建议您只使用CLLocationManager而不是KVO…但这是您的决定

-我修改了Google示例…使用了2个示例:

  • 使用KVO
  • 仅使用CLLocationManager
  • 如果你有任何问题…请告诉我

    PS别忘了添加API密钥

    快乐编码

    更新


    如果您启动DatingLocation..请不要忘记使用
    停止更新Location
    将其停止在某个位置。如果您在视图中注册,则请使用视图将消失来删除观察者


    如果您在viewDidLoad内注册,请使用deinit取消注册观察者。始终使用计数器部分注册和取消注册,这样就可以了

    Swift 3

    deinit {
         mapView.removeObserver(self, forKeyPath: "myLocation")
    }
    

    可能GMSMapView属性没有设置为
    strong
    。像这样
    @property(非原子,强)GMSMapView*mapView
    ?我将它设置为弱,因为它是IBOutlet@property(弱,非原子)IBOutlet GMSMapView*mapView;@TonyMkenu是的……我将它更改为'@property(强)IBMOutlet GMSMapView*mapView;'现在没有崩溃…但是地图不可见。它在1秒后隐藏。并且现在没有调用'observeValueForKeyPath:?然后,您的GMSMap有一些问题,可能现在它没有正确连接到您的IBOutlet@TonyMkenu我刚刚添加了一个UIView,然后将其子类化为GMSMapView,然后连接到IBMOutlet。没别的了。嗨,老兄…非常感谢你的努力。是的,这是我的临时决定。我完全删除了KVO,并与CLLocationManager合作。现在一切都好了。但需要更多调查。非常感谢你花时间。。。