Ios NotificationCenter:当块';他的主人被释放了

Ios NotificationCenter:当块';他的主人被释放了,ios,swift,closures,Ios,Swift,Closures,我有几个ViewController,它们通过调用属于我的类的函数间接订阅全局NotificationCenter实例: public func subscribeToValueChanges (key: String, callback: @escaping ()->Void) { changeNotifier.addObserver (forName: NSNotification.Name(rawValue: key), object: self, queue: Operat

我有几个ViewController,它们通过调用属于我的类的函数间接订阅全局NotificationCenter实例:

public func subscribeToValueChanges (key: String, callback: @escaping ()->Void)
{
    changeNotifier.addObserver (forName: NSNotification.Name(rawValue: key), object: self, queue: OperationQueue.main, using: { (n: Notification) in
        callback()
    })
}
(由管理,使用
addObserver(forName:object:queue:using:)

现在,我必须记住在释放我的viewcontroller时调用removeObserver,否则可能会导致泄漏。这有点不安全

我想知道是否有一种方法可以自动执行此操作,以便实现上述功能的类可以在释放块的所有者时进行学习。或者甚至在当前ViewController消失时(似乎没有全局通知,或者是否存在?)

或者,通过在闭包的代码中使用
[weak self]
callback
会变成nil,这样我就可以对所有回调执行偶尔的垃圾收集(通过将它们存储为数组中的可选项)


另一个想法是:ObjC运行时提供关联对象()–这些可能会附加到闭包上吗?这样我就可以监视该对象并了解闭包何时被释放。

根据您负责删除观察者的文档,一个可能的解决方案是在
视图中添加观察者将出现
并在
视图中删除它(我正在核心数据iCloud环境中使用它)@ VADEN-是的,这是显而易见的。我并不是试图避免删除观察者,但我尝试学习的时候,要做到这一点,不必记得写第二次调用在许多地方我将调用我的订阅BooValueChchange函数,因为这是容易忽视的,因此不是一个好的策略。因此,我喜欢解决PAR。在这个类中,它还管理addObserver的调用。这都是关于局部性的。提到
deinit
是删除观察者的正常位置,并且从iOS 9开始,当不使用基于块的观察者时,您甚至不需要自己删除观察者。