6

我已经阅读了关于 KVO 的苹果文档,它说:

注意:键值观察 addObserver:forKeyPath:options:context: 方法不维护对观察对象、被观察对象或上下文的强引用。您应该确保根据需要维护对观察对象和观察对象以及上下文的强引用。

观察者对象没有对被观察对象的强引用。

难道这个人我不能removeObserver:forKeyPath:dealloc方法中调用?它可以自动删除观察者吗?

4

4 回答 4

11

你必须手动调用-removeObserver:forKeyPath:。iOS 不会自动执行此操作。

苹果说does not maintain strong references to the observing object。我认为这意味着,如果您想将临时 var 的 removeObserver 移出 temp var 的范围,则应将 temp var 设为 ivar,以便维护 ivar 的强引用。

如果你不打电话-removeObserver:forKeyPath:。你会: 1) 有东西泄漏

比如你这样编码:

[self addObserver:a forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil];

如果你不打电话-removeObserver:forKeyPath:。它会安慰:

An instance 0x756a1d0 of class MyClass was deallocated while key value observers were still registered with it. Observation info was

泄漏,甚至可能被错误地附着在其他物体上。在 NSKVODeallocateBreak 上设置断点以在调试器中停止。这是当前的观察信息: [NSKeyValueObservationInfo 0x7574f60] ( [NSKeyValueObservance 0x7574f20: Observer: 0x7568280, Key path: pageCount, Options: [New: YES, Old: NO, Prior: NO] Context: 0x0, Property: 0x7574fa0] )

当你调试它时,你会发现:selfa没有泄漏。泄漏的东西是NSKeyValueObservationInfo object

如果你不打电话-removeObserver:forKeyPath:。您将: 2) 中级课程永远不会破坏 && Infinity 通知

正如有关 KVO 的 Apple 文档所说:

当观察者注册一个对象的属性时,被观察对象的 isa 指针被修改,指向一个中间类而不是真正的类。

当你 removeObserver 时,如果没有注册观察者,中间类就会销毁。并且如果你不调用removeObserver,中间类永远不会销毁,当你改变属性时,中间类的setter方法会继续发送通知。

于 2013-10-23T07:12:31.133 回答
2

removeObserver:forKeyPath: has nothing to do with memory management or maintaining references. It just tells the runtime that your object no longer needs to be informed of changes to the object at that keyPath.

于 2013-10-22T09:54:46.583 回答
1

no, you have to call it.

not strong is NOT always weak

but in this case it means unsafe_unretained.

If you don't remove the observer you get an error message: "the object XY was deallocated while there was still a observer"

AND it might crash

于 2013-10-22T09:54:24.733 回答
1

不,您必须-removerObserver:forKeyPath:在不再需要它时调用它,否则 KVO 系统将有一些悬空指针,这些指针可能会泄漏或附加到另一个不期望它的对象上。

于 2013-10-22T09:52:57.817 回答