无法将CLLocationManager委托设置为nil

时间:2011-12-11 21:20:27

标签: objective-c ios memory-management mkmapview cllocationmanager

因为在多种情况下我想从导航堆栈中弹出一个视图控制器,所以我有一个方法来执行它,并从三个不同的地方调用它。

- (void)dismissSelfCon {
    NSLog(@"dismiss");
    [locationManager stopUpdatingHeading];
    [locationManager stopUpdatingLocation];
    locationManager.delegate = nil;
    mapView.delegate = nil;
    [[NSNotificationCenter defaultCenter] removeObserver:self];

    [[[Trail_TrackerAppDelegate appDelegate] navCon] popViewControllerAnimated:YES];
}

在一种情况下,如果mapView上有一个注释(我不确定这是否是定义特征,但我认为是这样),这个方法被调用(我确信它被调用是因为@“dismiss”打印到控制台),但位置管理器不会停止发送位置更新!此外,由于委托未设置为nil,应用程序崩溃,因为视图控制器从其作为委托的其中一个对象接收respondsToSelector:

这怎么可能?

2 个答案:

答案 0 :(得分:0)

最可能的原因是此时locationManagernil。第一条规则:始终使用访问者;除initdeallloc以外,请勿直接访问您的ivars。

我对您的描述的怀疑是,dismissSelfCon期间此对象(具有locationManager.delegate的对象)无法清除dealloc,并且您在未调用{{}的情况下被解除分配1}}。

答案 1 :(得分:0)

解决方案是:

我设置视图控制器的方式(我知道这有点奇怪,如果你在这里看到我的问题,我正在尝试更改/修复:Can't allocate CLLocationManager),CLLocationManager是在viewDidAppear中被分配,委托集合等。我在应用程序期间呈现MFMessageComposeViewController,当它被解除时,再次调用viewDidAppear,重新分配CLLocationManager并导致我的问题。使用一点布尔魔法,我调整了viewDidAppear代码,以便只设置CLLocationManager并分配一次。