我有一些适用于许多对象的代码,将我的类注册为 KVO:
for (SPPanelManager *manager in self.panelManagers) {
[manager addObserver:self forKeyPath:@"dataFetchComplete" options:0 context:NULL];
[manager fetchData];
}
然后,当它观察到发生在每个这些对象上的变化时,我取消注册:
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if ([keyPath isEqualToString:@"dataFetchComplete"] && ((SPPanelManager *)object).dataFetchComplete) {
[object removeObserver:self forKeyPath:@"dataFetchComplete"];
//Other stuff
}
}
然后,当我稍后离开 UIViewController 时,每个管理器对象都会出现以下错误:
一个类的实例被解除分配,而键值观察者仍向其注册。观察信息被泄露,甚至可能被错误地附加到其他对象上。
我不知道为什么它给了我这个错误 - 这些是 KVO 唯一被引用的两个地方,所以它不是另一个观察者。