我何时应该删除观察员?在删除观察者之前释放对象的错误

Kao*_* Te 32 objective-c key-value-observing cocoa-bindings observer-pattern

我试图在我的一个类中使用键值观察.我在init方法中注册观察者并在dealloc中删除/注销它们,但是我得到了以下错误,这似乎是在调用dealloc方法之前发生的,根据我的调试打印.

正在释放类TekkPoint的实例0x583870,而键值观察者仍在其中注册.观察信息被泄露,甚至可能被错误地附加到其他物体上.在NSKVODeallocateBreak上设置断点以在调试器中停止.这是当前的观察信息:(上下文:0x0,属性:0x536400>上下文:0x0,属性:0x55aba0>)

有什么特别的方法可以删除观察者吗?或者也许是我应该删除它们的特定地方?

根据这个问题,我正在做正确的事情,但为什么我会收到此错误消息?

这是我的dealloc例程:

- (void)dealloc {
  // Remove all observers.
  for (NSString *path in [TekkPoint observedPaths]) {
    [self removeObserver:[option_ tChart]
          forKeyPath:path];

  }

  [description_ release];
  [weight_ release];
  [super dealloc];
}
Run Code Online (Sandbox Code Playgroud)

需要注意的一点是,我的实现可能很奇怪,我正在向观察者添加和删除观察者,这是否会导致我的问题?

BJ *_*mer 46

啊.您正在观察TekkPoint对象中的SomethingElse对象,并且该SomethingElse对象是添加和删除观察者的对象,对吗?(这是正常的事情;我只是想弄清楚.)

看起来你的TekkPoint对象正在被解除分配,而SomethingElse观察它的对象仍然存在.该SomethingElsedealloc方法不被调用,因为这是TekkPoint多数民众赞成被释放,而不是SomethingElse.

如果您计划在观察者消失之前观察可能消失的物体,那么您需要某种方式通知观察者他们应该移除他们的观察者.你TekkPoint可以拥有一个alive也可以被观察到的属性SomethingElse,当它被设置为时,NO每个观察它的人都TekkPoint将自己作为观察者移除.