iOS应用程序崩溃,因为KVO观察者不再观察了

时间:2016-11-18 01:22:52

标签: ios objective-c key-value-observing

有没有办法知道是否有对象侦听视图控制器的键路径。例如,我在我的viewcontroller中有

[tabBarController addObserver:self
     forKeyPath:@"selectedViewController"
     options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld
     context:&PrivateKVOContext
]; (edited)

我想知道我的tabbarcontroller是否可以知道我的viewcontroller是否正在侦听该keypath

原因是因为我的应用程序崩溃,因为标签栏控制器仍然认为我的视图控制器正在侦听该键路径,即使我的视图控制器已被释放

在我的viewcontroller的dealloc方法中,我将[tabBarController removeObserver:self forKeyPath:@"selectedViewController”];作为观察者移除

2 个答案:

答案 0 :(得分:0)

可悲的是没有。无法检查哪些对象当前正在观察其他对象。

因此,通常建议您将补充方法中的removeObserver:放置到放置addObserver:的方法中,以便可靠地调用相同的次数。

在这种情况下,由于你将它放在dealloc中,这是在视图控制器生命周期结束时调用的,所以你应该将addObserver:放在init方法中,这将在一开始。

答案 1 :(得分:-1)

这取决于观察者是否真正使用,在你的代码中,试试这个:

- (void)dealloc {

    @try {
        [[NSNotificationCenter defaultCenter] removeObserver:Notification_Location_Ready];
    } @catch (NSException *exception) {

    } @finally {

    }
}