我读过关于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] )
当你调试它时,你会发现: self
和a
没有泄漏。泄漏的是NSKeyValueObservationInfo object
如果你不打电话给-removeObserver:forKeyPath:
.你会做出:2)中级类永不破坏&&无限通知
正如苹果关于KVO的文件所说:
当观察者为对象的属性注册时,则 修改被观察对象的指针,指向 中级阶级而不是真正的阶级。
删除观察者时,如果没有注册观察者,则中间类将销毁。如果你不调用 removeObserver,中间类将永远不会销毁,当你更改属性时,中间类的 setter 方法将继续发送通知。
removeObserver:forKeyPath:
与内存管理或维护引用无关。它只是告诉运行时,不再需要通知对象在该 keyPath 上对对象的更改。
不,您必须在不再需要时调用-removerObserver:forKeyPath:
,否则 KVO 系统将有一些悬而未决的指针,这些指针可能会泄漏或附加到另一个不期望它的对象。
不,你必须调用它。
不强并不总是弱
但在这种情况下,这意味着unsafe_unretained。
如果不删除观察程序,则会收到一条错误消息:"对象 XY 已解除分配,而仍有观察程序"
它可能会崩溃