因为在多种情况下我想从导航堆栈中弹出一个视图控制器,所以我有一个方法来执行它,并从三个不同的地方调用它。
- (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:
这怎么可能?
答案 0 :(得分:0)
最可能的原因是此时locationManager
为nil
。第一条规则:始终使用访问者;除init
和deallloc
以外,请勿直接访问您的ivars。
我对您的描述的怀疑是,dismissSelfCon
期间此对象(具有locationManager.delegate
的对象)无法清除dealloc
,并且您在未调用{{}的情况下被解除分配1}}。
答案 1 :(得分:0)
解决方案是:
我设置视图控制器的方式(我知道这有点奇怪,如果你在这里看到我的问题,我正在尝试更改/修复:Can't allocate CLLocationManager),CLLocationManager是在viewDidAppear中被分配,委托集合等。我在应用程序期间呈现MFMessageComposeViewController,当它被解除时,再次调用viewDidAppear,重新分配CLLocationManager并导致我的问题。使用一点布尔魔法,我调整了viewDidAppear代码,以便只设置CLLocationManager并分配一次。