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

Best Place to Remove NotificationCenter Observer in Swift Struct

假设我们有一个给定的 Swift class.

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

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

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

从 iOS 9 及更高版本开始,没有必要 移除 NotificationCenter 观察者,因为它们是 自动移除的 .

如果您担心观察卡在内存中,您应该从处理结构的 class 中调用删除。

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

一起使用

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

根据 release notes.

NSNotificationCenter and NSDistributedNotificationCenter no longer send notifications to registered observers that may be deallocated. If the observer is able to be stored as a zeroing-weak reference the underlying storage stores the observer as a zeroing weak reference. Alternatively, if the object cannot be stored weakly (because it has a custom retain/release mechanism that would prevent the runtime from being able to store the object weakly) the object is stored as a non-weak zeroing reference. This means that observers are not required to un-register in their deallocation method.