observadores de valores-chave ainda estavam registrados quando o controlador é desalocado
Adicionei um observador no código e o removi em dealloc e viewWillDisappear, mas ainda estou recebendo um erro informando
*** Finalizando o aplicativo devido à exceção não capturada 'NSInternalInconsistencyException', motivo: 'Uma instância 0x167e5980 da classe MyController2 foi desalocada enquanto os observadores de valores-chave ainda estavam registrados com ele.
Current observation info: <NSKeyValueObservationInfo 0x16719f90> (
<NSKeyValueObservance 0x16719fb0: Observer: 0x167e5980, Key path: dataContainer.report, Options: <New: YES, Old: YES, Prior: NO> Context: 0x0, Property: 0x1677df30>
)'
Eu criei um controlador,MyController
e derivar um novo controladorMyController2
a partir dele. Agora eu adicionei o KVO noMyController2
.
- (void)viewDidLoad {
[super viewDidLoad];
[self addObserver:self forKeyPath:@"dataContainer.report" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
}
Em seguida, em observeValueForKeyPath: -
- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context {
id oldC = [change objectForKey:NSKeyValueChangeOldKey];
id newC = [change objectForKey:NSKeyValueChangeNewKey];
if([keyPath isEqualToString:@"dataContainer.report"]) {
if (oldC != newC) {
//Remove Observer
[self removeObserver:self forKeyPath:@"dataContainer.report" context:nil];
[self updateDataContainer];
[self reportView];
}
}
}
Então tentei remover o observador no viewWillDisappear e dealloc:
- (void)dealloc {
@try{
[self removeObserver:self forKeyPath:@"dataContainer.report" context:nil];
}@catch(id anException){
}
}
-(void) viewWillDisappear:(BOOL)animated{
@try{
[self removeObserver:self forKeyPath:@"dataContainer.report" context:nil];
}@catch(id anException){
}
[super viewWillDisappear:animated];
}
Eu olhei para a perda de posts, todos eles dizem uma coisa que você precisa remover o observador. Eu tentei remover o observador de ambos, mas ainda estou recebendo o problema.