在Swift结构中删除NotificationCenter观察者的最佳位置

在Swift结构中删除NotificationCenter观察者的最佳位置,swift,nsnotificationcenter,Swift,Nsnotificationcenter,假设我们有一个给定的Swift类 class Test { init() { NotificationCenter.default.addObserver( ... ) } deinit { NotificationCenter.default.removeObserver(self) } } 在类中,可以使用deinit lifecycle方法删除NotificationCenter观察者。在结构中,没有deinit方法。因

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

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

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

在类中,可以使用deinit lifecycle方法删除NotificationCenter观察者。在结构中,没有deinit方法。因此,我的问题是,在结构中,在哪里删除NotificationCenter观察者?或者,我们不必删除结构中的观察者吗?

从iOS 9及更高版本中,不必删除NotificationCenter观察者,因为它们会自动删除


如果您仍然担心观察被卡在内存中,那么应该调用从处理结构的类中删除。从iOS 9及更高版本中,无需删除NotificationCenter观察者,因为它们会自动删除


如果您仍然担心内存中的观察对象,那么应该调用从处理该结构的类中移除的操作。

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

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

据报道

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


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

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

据报道

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


您可以让结构保留对类的引用。在类上调用dealloc时,您知道该结构已被解除分配。您可以让该结构保留对类的引用。在类上调用dealloc时,您知道该结构已被解除分配。实际上,您可以使用闭包而不是@objc选择器方法将结构注册为观察者,方法是使用func addObserverforName:NSNotification.name?,object obj:Any?,queue:OperationQueue?,使用block:@escaping Notification->Void->NSObjectProtocol实际上,您可以使用closure而不是@objc selector方法将结构注册为观察者,使用func addObserverforName:NSNotification.name?,object obj:Any?,queue:OperationQueue?,使用块:@转义通知->无效->NSObjectProtocol