在 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.
假设我们有一个给定的 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.