Ios 我必须手动移除KVO中的Observer吗

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

我读过关于KVO的t,它说:

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

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


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