我正在尝试在Swift 4中实现KVC / KVO。我在Objective-C中为KVC / KVO阅读的大部分文档指出,当你完成它时需要删除观察者。但是,在查看Apple使用Swift 4实现KVO的文档之后,他们没有明确说明是否需要在deinit方法中删除观察者。它们在示例类定义中不包含deinit方法。但是,我不想做任何假设,因为我读过的所有Objective-C文档都指出需要删除观察者。
我只是不确定观察者是否需要通过deinit删除。对参考方向的任何帮助或观点都会很棒,谢谢。
答案 0 :(得分:0)
重新注册观察员的规则在10.13中放宽了Foundation Release Notes(强调添加):
放宽键值观察注销要求
在10.13之前,如果在autonotifying对象的-dealloc完成运行后仍然注册了任何观察者,KVO将抛出异常。此外,如果所有观察者都被删除,但有些观察者在
dealloc
期间从另一个线程中删除,则异常将被错误地抛出。这一要求已在10.13中放宽,但有两个条件:
- 对象必须使用KVO自动审核,而不是手动调用
-will
和-didChangeValueForKey:
(即它不应该从+automaticallyNotifiesObserversForKey:
返回NO)- 对象不得覆盖内部KVO状态的(私有)访问者
如果所有这些都是真的,在
-dealloc
返回后剩余的观察者将被KVO清理;这比重复调用-removeObserver
方法更有效。
HTH
答案 1 :(得分:0)
如果你在谈论NSKeyValueObservation
:不,他们没有。
来自WWDC 2017 Video "What is new in Foundation"
的成绩单我不需要
deinit
扔掉或拆除我的观察,因为它与观察令牌的生命周期有关。因此,当控制器消失时,观察令牌就会消失。