Я добавил наблюдатель в коде, а затем удалить его в dealloc и viewWillDisappear, но до сих пор я получаю сообщение об ошибке сключевых наблюдателей значения по-прежнему зарегистрированы с ним, когда контроллер высвобожден
*** Нагрузочным приложением из-за для исключения исключений «NSInternalInconsistencyException», причина: «Экземпляр 0x167e5980 из класс MyController2 был освобожден, а наблюдатели ключевых значений были , которые все еще зарегистрированы с ним.
Current observation info: <NSKeyValueObservationInfo 0x16719f90> ( <NSKeyValueObservance 0x16719fb0: Observer: 0x167e5980, Key path: dataContainer.report, Options: <New: YES, Old: YES, Prior: NO> Context: 0x0, Property: 0x1677df30> )'
Я создал контроллер, MyController
и получить новый контроллер MyController2
от него. Теперь я добавил KVO в MyController2
.
- (void)viewDidLoad {
[super viewDidLoad];
[self addObserver:self forKeyPath:@"dataContainer.report" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
}
Тогда в 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];
}
}
}
Затем я попытался удалить наблюдатель в viewWillDisappear и 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];
}
я смотрел на потерянных посты, все они говорят вам нужно удалить наблюдателя. Я попытался удалить наблюдателя у обоих из них, но все же у меня проблема.
ошибка показывает, что вы добавляются наблюдателем для пути к 'dataContainer.inspectionReport', но ваш код показывает путь ключа как' dataContainer .report'. –
@MidhunMP извините, что я изменил эту часть из кода и забыл переходить от ошибки. Теперь я изменил его.Пожалуйста, дайте мне знать, если вы найдете что-нибудь, почему я получаю сообщение об ошибке –
Я бы предложил вести журнал везде, где вы добавляете и удаляете наблюдателей, и я уверен, вы обнаружите, что они не сбалансированы. – Rob