假设我们有一个给定的Swift类。
class Test {
init() {
NotificationCenter.default.addObserver( ... )
}
deinit {
NotificationCenter.default.removeObserver(self)
}
}
在类中,您可以使用deinit
生命周期方法删除NotificationCenter
观察者。在结构中,没有deinit
方法。因此,我的问题是,有人会删除结构中的NotificationCenter
观察者吗?或者,我们不必删除结构中的观察者吗?
答案 0 :(得分:3)
从iOS 9及更高版本开始,无需删除NotificationCenter
观察者,因为会自动删除。
如果你担心观察到的内存仍然存在,你应该从处理结构的类中调用remove。
答案 1 :(得分:1)
您无法在NotificationCenter
中注册结构作为观察者。使用addObserver(_:selector:name:object:)
方法时,必须将Selector
作为参数传递。选择器必须是标有@objc
的函数,并且只能在类中使用它。
当涉及到类时,您可以按照问题中提到的deinit
方法取消注册观察者。但是,从iOS 9开始,您不必手动删除观察者,因为此版本NSNotificationCenter
存储了对观察者的弱引用。 不会自动删除观察者。
NSNotificationCenter和NSDistributedNotificationCenter不再向可能已解除分配的已注册观察者发送通知。如果观察者能够存储为归零弱引用,则底层存储将观察者存储为归零弱引用。或者,如果对象不能被弱存储(因为它具有会阻止运行时能够弱存储对象的自定义保留/释放机制),则该对象被存储为非弱的归零引用。这意味着观察者不需要在他们的释放方法中取消注册。