Ios 类正在解除分配,而KVO仍在注册

Ios 类正在解除分配,而KVO仍在注册,ios,key-value-observing,dealloc,Ios,Key Value Observing,Dealloc,我一直在努力找出问题的症结所在,但由于很难重现,所以一直未能找到答案。以下是错误: 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因是:“JASidePanelViewController类的实例0x1455c7fa0已解除分配,而键值观察员仍在向其注册。”。当前观测信息:()' 从错误消息中,我可以尝试在释放实例之前删除观察者。代码如下: 侧面板ViewController.h #import "JASidePanelController

我一直在努力找出问题的症结所在,但由于很难重现,所以一直未能找到答案。以下是错误:

由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因是:“JASidePanelViewController类的实例0x1455c7fa0已解除分配,而键值观察员仍在向其注册。”。当前观测信息:()'

从错误消息中,我可以尝试在释放实例之前删除观察者。代码如下:

侧面板ViewController.h

#import "JASidePanelController.h"
@interface SidePanelViewController : JASidePanelController
@end
侧面板ViewController.m

...
@implementation SidePanelViewController
...
- (void)viewDidLoad {
    [super viewDidLoad];
    [self addObserver:self forKeyPath:@"state" options:NSKeyValueObservingOptionNew context:nil];
}

- (void)viewDidUnload:(BOOL)animated {
    [self viewDidUnload:animated];
    [self removeObserver:self forKeyPath:@"state"];
}
...
@end
更新:
做了更多的研究,我发现viewDidUnload不是删除观察者的可靠方法,因为它并不总是被调用。因此,有两种可能的解决方案:1)在viewDidLoad中创建观察者,同时在-(void)dealloc中将其删除配对,或2)在ViewDidDisplay中创建并删除观察者,ViewWillEnglishe(根据Gargoyle的建议)。

viewDidAppear()
中添加观察者,并在
ViewWillEnglishe
中删除它们,我最终在viewDidLoad和dealloc中配对创建和删除观察者,而不是ViewDidDisplay和ViewWillEnglish:

@implementation SidePanelViewController

...

- (void)viewDidLoad{
    [super viewDidLoad];
    [self addObserver:self forKeyPath:@"state" options:NSKeyValueObservingOptionNew context:nil];
}

- (void) dealloc{
    [self removeObserver:self forKeyPath:@"state"];
}

...

@end
显然,有各种各样的场景没有调用ViewWillEnglish,因此,当我使用ViewDidDisplay和ViewWillEnglishe创建/删除观察者时,我在不同的时间都遇到了以下错误:


***由于未捕获的异常“NSRangeException”而终止应用程序,原因是:“无法从中删除密钥路径“state”的观察者,因为它未注册为观察者。”

请查看将观察者添加到
JASidePanelViewController
的代码。确保您拥有在适当时删除该观察者的代码。用相关代码更新您的问题。对addObserver进行全局搜索。一般来说,我的方法是在viewDidAppear中添加观察者,并在viewDidAppear中删除它们,否则它们将消失,除非您真的不需要这样做。谢谢,rmaddy和石像鬼。找到观察者后,我可以看到prob使用的是viewDidLoad和viewDidUnload。当调用dealloc时,我注意到viewDidUnload不是,因此,观察者事先没有被移除。如果你们想发布正式的解决方案,我会接受并给予你们信任。