我是否必须手动删除 KVO 中的观察者



我读过关于KVO的苹果文档,上面写着:

注意:键值观察 addObserver:forKeyPath:options:context: 方法不维护对观测对象的强引用, 观察到的对象或上下文。您应该确保 保持对观察和被观察物体的强烈引用, 以及必要的上下文。

观察

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

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

你必须打电话给-removeObserver:forKeyPath: manaully。 iOS不会自动执行此操作。

苹果does not maintain strong references to the observing object .我认为这意味着,如果您想将临时变量的观察者从临时变量的范围中删除,您应该将临时变量设置为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:观察者:0x7568280,键路径:页计数,选项:[新:是,旧:否,先前:否] 上下文:0x0, 属性: 0x7574fa0] )

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

如果你不打电话给-removeObserver:forKeyPath:.你会做出:2)中级类永不破坏&&无限通知

正如苹果关于KVO的文件所说:

当观察者为对象的属性注册时,则 修改被观察对象的指针,指向 中级阶级而不是真正的阶级。

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

removeObserver:forKeyPath:

内存管理或维护引用无关。它只是告诉运行时,不再需要通知对象在该 keyPath 上对对象的更改。

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

不,你必须调用它。

不强并不总是弱

但在这种情况下,这意味着unsafe_unretained。

如果不删除观察程序,则会收到一条错误消息:"对象 XY 已解除分配,而仍有观察程序"

它可能会崩溃

最新更新