Ios 在iPhone上的谷歌地图上获取我的位置时崩溃
我给你写信是因为我遇到了一个非常奇怪的错误。 我尝试在我的应用程序中添加GMS,最后,当我必须获取设备位置时,我陷入了崩溃: 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因是:“GMSMapView类的实例0x7ff7fd82def0已解除分配,而键值观察员仍在向其注册。”。当前观测信息:( 上下文:0x0,属性:0x7ff7fdc2f470> 代码在此处初始化: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;
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个示例:
如果您启动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合作。现在一切都好了。但需要更多调查。非常感谢你花时间。。。