如何安全地删除Observer(Swift)

Lud*_*uda 12 ios swift

我添加了一个观察者

override func viewDidLoad()
{
    super.viewDidLoad()

    NSNotificationCenter.defaultCenter().addObserver(self, selector:"selector name", name: "observer name", object:nil)
    ...
}
Run Code Online (Sandbox Code Playgroud)

在deinit中移除观察者时,

deinit
{
    NSNotificationCenter.defaultCenter().removeObserver(self, forKeyPath: <some string>)
}
Run Code Online (Sandbox Code Playgroud)

该应用程序有时会崩溃:

由于未捕获的异常'NSRangeException'而终止应用程序,原因是:'无法从NSNotificationCenter中删除关键路径"some string"的观察者"class",因为它未注册为观察者.


所以我想添加do/catch

deinit
{
    do{
        try NSNotificationCenter.defaultCenter().removeObserver(self, forKeyPath: <some string>)
    }catch{}
}
Run Code Online (Sandbox Code Playgroud)

但我得到一个警告:

catch块无法访问,因为do块中没有抛出任何错误

应用程序崩溃了


当我添加一个尝试

deinit
{
    do{
        try NSNotificationCenter.defaultCenter().removeObserver(self, forKeyPath: <some string>)
    }catch{}
}
Run Code Online (Sandbox Code Playgroud)

我收到这个警告:

在try expresion中没有调用抛出函数

应用程序崩溃了

应该怎么做?

Ilk*_*aci 6

如果您支持9.0之前的iOS版本,则无需在deinit方法中自行删除观察者。

取自文档

在OS X 10.11和iOS 9.0中,NSNotificationCenter和NSDistributedNotificationCenter将不再向可能释放的已注册观察者发送通知。

https://useyourloaf.com/blog/unregistering-nsnotificationcenter-observers-in-ios-9/


vie*_* vu 5

我认为你应该使用代码

NSNotificationCenter.defaultCenter().removeObserver(self)
Run Code Online (Sandbox Code Playgroud)

解释:你在这里有错误:你正在使用 NSNotification 和 NSNotificationCenter,所以你必须使用上面的代码来删除观察。你已经使用 KVO 代码来删除观察者,所以它会出错。

您可以在此处阅读更多详细信息。键值观察