ich einen Beobachter im Code hinzugefügt und entfernt sie dann in dealloc und viewWillDisappear aber noch bin ich eine Fehlermeldung bekommenSchlüsselwert Beobachter waren noch bei ihm registriert, wenn die Steuerung freigegeben wird
Angabe *** App beenden wegen für die nicht abgefangene Ausnahme 'NSInternalInconsistencyException', Grund: 'Eine Instanz 0x167e5980 der Klasse MyController2 wurde freigegeben, während Schlüsselwertbeobachter noch 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> )'
habe ich einen Controller, MyController
und einen neuen Controller MyController2
daraus ziehen. Jetzt habe ich KVO in MyController2
hinzugefügt.
- (void)viewDidLoad {
[super viewDidLoad];
[self addObserver:self forKeyPath:@"dataContainer.report" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
}
Dann in 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];
}
}
}
Dann habe ich versucht, Beobachter in viewWillDisappear zu entfernen und dealloc beides: -
- (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 verloren Pfosten sah, alle von ihnen sagen eine Sache, die Sie Beobachter entfernen müssen. Ich habe versucht, Beobachter von beiden zu entfernen, aber ich bekomme immer noch das Problem.
Der Fehler zeigt, dass Sie Für den Schlüsselpfad 'dataContainer.inspectionReport' wurde ein Observer hinzugefügt, der Code zeigt jedoch den Schlüsselpfad als 'dataContainer' an .report'. –
@MidhunMP Tut mir leid, eigentlich habe ich diesen Teil vom Code geändert und vergisst, den Fehler zu ändern. Jetzt habe ich es geändert.Bitte lassen Sie mich wissen, wenn Sie etwas finden, warum ich den Fehler –
bekomme Ich würde vorschlagen, überall zu loggen, die Sie Beobachter hinzufügen und entfernen, und ich wette, Sie werden finden, dass sie nicht ausgeglichen sind. – Rob