是否需要在Swift 4 / Objective-C中删除观察者?

时间:2018-02-10 15:10:15

标签: objective-c cocoa swift4 key-value-observing

我正在尝试在Swift 4中实现KVC / KVO。我在Objective-C中为KVC / KVO阅读的大部分文档指出,当你完成它时需要删除观察者。但是,在查看Apple使用Swift 4实现KVO的文档之后,他们没有明确说明是否需要在deinit方法中删除观察者。它们在示例类定义中不包含deinit方法。但是,我不想做任何假设,因为我读过的所有Objective-C文档都指出需要删除观察者。

https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/AdoptingCocoaDesignPatterns.html#//apple_ref/doc/uid/TP40014216-CH7-ID12

我只是不确定观察者是否需要通过deinit删除。对参考方向的任何帮助或观点都会很棒,谢谢。

2 个答案:

答案 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扔掉或拆除我的观察,因为它与观察令牌的生命周期有关。因此,当控制器消失时,观察令牌就会消失。