我是否必须手动删除KVO中的Observer

时间:2013-10-22 09:50:19

标签: ios objective-c key-value-observing

我已经阅读了关于KVO的apple documen t,它说:

  

注意:键值观察addObserver:forKeyPath:options:context:   方法不保持对观察对象的强引用,   观察到的对象或上下文。你应该确保你   保持对观察和观察物体的强烈参考,   和必要的背景。

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

这位男士我不能在removeObserver:forKeyPath:方法中拨打dealloc吗?它可以自动删除观察者吗?

4 个答案:

答案 0 :(得分:10)

您必须致电-removeObserver:forKeyPath: manaully。 iOS不会自动执行此操作。

Apple说 does not maintain strong references to the observing object 。我认为这意味着,如果你想从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]上下文:0x0,   物业:0x7574fa0]       )

调试时,您会发现:selfa没有泄露。泄漏的是NSKeyValueObservationInfo object

如果您不致电-removeObserver:forKeyPath:。你会做:2)中级班永远不会破坏&&无限通知

正如关于KVO的Apple文件所说:

  

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

不,你必须打电话。

不强不总是很弱

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

如果您不删除观察者,则会收到错误消息:“当仍有观察者时,对象XY已被释放”

它可能会崩溃

答案 3 :(得分:1)

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