Schlüsselwertbeobachter waren noch registriert, als die Zuordnung des Controllers aufgehoben wurde

Ich habe einen Beobachter in den Code eingefügt und ihn dann in dealloc und viewWillDisappear entfernt. Trotzdem erhalte ich die Fehlermeldung

*** Beenden der App aufgrund einer nicht erfassten Ausnahme 'NSInternalInconsistencyException', Grund: 'Eine Instanz 0x167e5980 der Klasse MyController2 wurde freigegeben, während Schlüsselwertbeobachter noch bei ihr registriert waren.

Current observation info: <NSKeyValueObservationInfo 0x16719f90> (
<NSKeyValueObservance 0x16719fb0: Observer: 0x167e5980, Key path: dataContainer.report, Options: <New: YES, Old: YES, Prior: NO> Context: 0x0, Property: 0x1677df30>
)'

Ich habe einen Controller erstellt,MyController und leite einen neuen Controller abMyController2 davon. Jetzt habe ich KVO in @ hinzugefüMyController2.

- (void)viewDidLoad {
    [super viewDidLoad];
    [self addObserver:self forKeyPath:@"dataContainer.report" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
}

Then in observValueForKeyPath: -

- (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];
        }
    }
}

Dann habe ich versucht, den Beobachter in viewWillDisappear zu entfernen und die Zuordnung beider zu lösen: -

- (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];
}

Ich habe mich nach verloren gegangenen Posts umgesehen. Alle sagen etwas aus, was Sie brauchen, um den Beobachter zu entfernen. Ich habe versucht, den Beobachter von beiden zu entfernen, aber ich bekomme immer noch das Problem.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage