在Swift Struct中删除NotificationCenter Observer的最佳位置

时间:2017-10-05 16:46:23

标签: swift nsnotificationcenter

假设我们有一个给定的Swift类。

class Test {
    init() {
        NotificationCenter.default.addObserver( ... ) 
    }

    deinit {
        NotificationCenter.default.removeObserver(self)
    }
}

在类中,您可以使用deinit生命周期方法删除NotificationCenter观察者。在结构中,没有deinit方法。因此,我的问题是,有人会删除结构中的NotificationCenter观察者吗?或者,我们不必删除结构中的观察者吗?

2 个答案:

答案 0 :(得分:3)

从iOS 9及更高版本开始,无需删除NotificationCenter观察者,因为会自动删除

如果你担心观察到的内存仍然存在,你应该从处理结构的类中调用remove。

答案 1 :(得分:1)

您无法在NotificationCenter中注册结构作为观察者。使用addObserver(_:selector:name:object:)方法时,必须将Selector作为参数传递。选择器必须是标有@objc的函数,并且只能在类中使用它。

当涉及到类时,您可以按照问题中提到的deinit方法取消注册观察者。但是,从iOS 9开始,您不必手动删除观察者,因为此版本NSNotificationCenter存储了对观察者的弱引用。 不会自动删除观察者。

根据release notes

  

NSNotificationCenter和NSDistributedNotificationCenter不再向可能已解除分配的已注册观察者发送通知。如果观察者能够存储为归零弱引用,则底层存储将观察者存储为归零弱引用。或者,如果对象不能被弱存储(因为它具有会阻止运行时能够弱存储对象的自定义保留/释放机制),则该对象被存储为非弱的归零引用。这意味着观察者不需要在他们的释放方法中取消注册。