Ios 我必须手动移除KVO中的Observer吗
我读过关于KVO的t,它说: 注意:关键字值addObserver:forKeyPath:options:context: 方法不维护对观察对象的强引用, 观察到的对象或上下文。你应该确保你 保持对观察对象和被观察对象的有力引用, 以及必要的上下文 观察者对象没有对被观察对象的强引用Ios 我必须手动移除KVO中的Observer吗,ios,objective-c,key-value-observing,Ios,Objective C,Key Value Observing,我读过关于KVO的t,它说: 注意:关键字值addObserver:forKeyPath:options:context: 方法不维护对观察对象的强引用, 观察到的对象或上下文。你应该确保你 保持对观察对象和被观察对象的有力引用, 以及必要的上下文 观察者对象没有对被观察对象的强引用 在dealloc方法中,我是否不能调用这个人removeObserver:forKeyPath:?它能自动删除观察者吗?否,当不再需要它时,您必须调用-RemoveObserver:forKeyPath:,否则KV
在
dealloc
方法中,我是否不能调用这个人removeObserver:forKeyPath:
?它能自动删除观察者吗?否,当不再需要它时,您必须调用-RemoveObserver:forKeyPath:
,否则KVO系统将有一些悬空指针,这些指针可能泄漏或连接到另一个不需要它的对象。否,您必须调用它
不坚强并不总是软弱的
但在这种情况下,它意味着不安全的
如果不删除观察者,则会收到一条错误消息:“对象XY在仍有观察者时被解除分配”
而且它可能会崩溃removeObserver:forKeyPath:与内存管理或维护引用无关。它只是告诉运行时,您的对象不再需要在该关键路径上被通知对象的更改。您必须手动调用
-removeObserver:forKeyPath:
。iOS不会自动执行此操作
苹果公司表示,没有对观测对象进行强引用。我认为这意味着,如果你想将一个临时变量的观察者从临时变量的作用域中移除,你应该将临时变量设置为ivar,这样你就可以维护ivar的强引用
如果不调用-removeObserver:forKeyPath:
。您将使:1)有东西泄漏
例如,您的代码如下所示:
[self addObserver:a forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil];
如果不调用-removeObserver:forKeyPath:
。它将安慰:
泄漏,甚至可能错误地连接到其他对象。
在NSKVODeallocateBreak上设置断点,使其在调试器中停止。
以下是当前的观察信息:
[NSKeyValueObservationInfo 0x7574f60](
[NSKeyValue0x7574F20:观察者:0x7568280,键路径:pageCount,选项:[新:是,旧:否,先前:否]上下文:0x0,
属性:0x7574fa0]
)
调试时,您会发现:self
和a
没有泄漏。泄漏的对象是NSKeyValueObservationInfo对象
如果不调用-removeObserver:forKeyPath:
。您将发出:2)中间类永不销毁和无限通知
正如苹果关于KVO的文件所说:
当观察者注册对象的属性时,isa
被观察对象的指针被修改,指向
中间阶级而不是真正的阶级
当您移除观察器时,如果没有注册观察器,则中间类将销毁。如果您不调用removeObserver,中间类将永远不会销毁,当您更改属性时,中间类的setter方法将继续发送通知。谢谢。我幸运地意外地发现了我的无限通知问题,这澄清了发生的事情。我希望KVO能让被观察的对象释放并自动停止观察。
An instance 0x756a1d0 of class MyClass was deallocated while key value observers were still registered with it. Observation info was