Ios 当应用程序激活时,在didUpdateLocations中执行错误访问

Ios 当应用程序激活时,在didUpdateLocations中执行错误访问,ios,iphone,exc-bad-access,cllocationmanager,cllocation,Ios,Iphone,Exc Bad Access,Cllocationmanager,Cllocation,在我的iOS7应用程序中,我有一个名为ICVModel的单例。当应用程序启动时,此单例将被初始化并创建CLLocationManager,它将立即开始更新位置。这很好用,CLLocationManager是ICVModel中的一个强大属性。我已经实现了didUpdateLocations:来始终将最后一个位置保存到ICVModel在这个单例上的strong属性 我的问题是,当应用程序进入后台并再次激活时,我总是在didUpdateLocations: - (void)locationManage

在我的iOS7应用程序中,我有一个名为ICVModel的单例。当应用程序启动时,此单例将被初始化并创建
CLLocationManager
,它将立即开始更新位置。这很好用,
CLLocationManager
ICVModel
中的一个强大属性。我已经实现了
didUpdateLocations:
来始终将最后一个位置保存到
ICVModel
在这个单例上的strong属性

我的问题是,当应用程序进入后台并再次激活时,我总是在
didUpdateLocations:

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    [ICVModel sharedSingleton].lastLocation = [locations lastObject]; //EXC_BAD_ACCESS
}
另外,我的应用程序使用基于区域的通知,所以在这种情况下,当应用程序位于后台(并且ICVModel已解除分配)时,是否可能调用此方法


我不知道为什么。。。非常感谢

修复了它。问题出在其他方面。在一个ViewController中,我为这个lastLocation属性更改添加了一个观察者,但没有删除它…当应用程序转到后台时,VC被解除分配(我手动解除分配),但singleton仍在运行,并试图在解除分配的对象(->EXC_BAD_ACCESS)上调用observeValueForKeyPath:ofObject:

这基本上导致了问题(在某些VC中):

这就解决了这个问题:

- (void)viewDidDisappear:(BOOL)animated {
    [[ICVModel sharedSingleton] removeObserver:self
                                    forKeyPath:@"lastLocation"];
}

感谢大家的帮助,希望这至少能帮助一些人…

这可能会帮助你,很可能其中一个是零,你能在代码行前面放一个NSLog来显示他们的内容吗?我认为你的单例实现有问题,但可以肯定的是,设置一个异常断点,然后查看backtracewell启用僵尸,并尝试查看是什么导致它在本例中没有任何结果。。。我了解exc\u bad\u访问是什么,以及它的原因,但我不知道为什么在这种情况下会被触发:)那么它们中有没有一个是零?
- (void)viewDidDisappear:(BOOL)animated {
    [[ICVModel sharedSingleton] removeObserver:self
                                    forKeyPath:@"lastLocation"];
}