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

问题描述:

有没有办法知道在视图控制器的键路径上是否有对象侦听。例如,我在我的ViewControlleriOS应用程序崩溃,因为KVO观察者不再观察

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

而且我想知道如果我的tabbarcontroller知道我的视图 - 控制是对的keyPath

的原因是听,因为我的应用程序崩溃,因为标签栏控制器还自以为我的视图控制器是听,即使我的视图控制器已释放

而在我的视图控制器的dealloc方法是关键路径上,我把[tabBarController removeObserver:self forKeyPath:@"selectedViewController”];以去掉自己作为一个观察者

+0

如果观察者是没有得到清除,试着写'[NSNotificationCenter defaultCenter] removeObserver:observerObjectHere]'的'viewWillDisappear ' – pkc456

+0

切线类型,但为什么选择不同选项卡时,选项卡栏控制器中的视图控制器应该如何处理?这听起来像一个糟糕的设计。 – rmaddy

+0

你为什么不继承tabBarController并创建协议,使用它你可以发送更改selectedViewController的委托消息。这将是更清晰的解决方案。 –

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

因此,通常建议您将removeObserver:置于补充方法中,将addObserver:置于addObserver:之后,这样可以可靠地将其称为相同的次数。

在这种情况下,因为你把它的dealloc,这就是所谓的视图控制器的生命周期结束时,你应该把addObserver:init方法,它会在被称为最开始。

这取决于如果观察者确实在使用中,在你的代码,试试这个:

- (void)dealloc { 

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

    } @finally { 

    } 
} 
+2

**请不要**使用此。 'try-catch'是一个完整**糟糕的习惯**。这只会隐藏代码中的显而易见的错误,它不会修复它。相反,他应该创建一些结构以保持对观察者的引用,然后在适当时删除它们。 –