【问题标题】:Exc_bad_acces in didUpdateLocations when app becomes active当应用程序激活时,didUpdateLocations 中的 Exc_bad_acces
【发布时间】:2014-03-25 09:25:48
【问题描述】:

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

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

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    [ICVModel sharedSingleton].lastLocation = [locations lastObject]; //EXC_BAD_ACCESS
}

我的应用也使用基于区域的通知,所以在这种情况下,当应用处于后台时(并且 ICVModel 已被释放?)是否有可能调用此方法?

我不知道为什么...非常感谢!

【问题讨论】:

  • 这可能对你有帮助stackoverflow.com/questions/327082/…
  • 其中一个很可能是 nil,你能在代码行前面放一个 NSLog 来显示它们的内容吗
  • 我认为你的单例实现有问题,但肯定设置一个异常断点并查看回溯
  • 很好地启用僵尸并试图查看是什么导致它在这种情况下没有任何结果......我了解 exc_bad_access 是什么以及它为什么会导致,但我不知道为什么它在这种情况下被解雇: )
  • 那么它们中的任何一个都是 nil 吗?

标签: ios iphone exc-bad-access cllocationmanager cllocation


【解决方案1】:

修复它。问题出在别的东西上。在一个 ViewController 中,我为这个 lastLocation 属性更改添加了一个观察者,但没有将其删除......当应用程序进入后台时,VC 被释放(我手动完成)但单例仍在运行并试图调用 observeValueForKeyPath: ofObject:在已释放对象上 (-> EXC_BAD_ACCESS)。

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

[[ICVModel sharedSingleton] addObserver:self
                                 forKeyPath:@"lastLocation"
                                    options:NSKeyValueObservingOptionNew
                                    context:NULL];

这解决了它:

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

感谢大家的帮助,希望这至少对某人有所帮助...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-15
    • 2019-12-01
    • 2013-07-01
    • 2011-07-24
    • 2015-08-20
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多