我添加了一个观察者
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中没有调用抛出函数
应用程序崩溃了
应该怎么做?
如果您支持9.0之前的iOS版本,则无需在deinit方法中自行删除观察者。
取自文档
在OS X 10.11和iOS 9.0中,NSNotificationCenter和NSDistributedNotificationCenter将不再向可能释放的已注册观察者发送通知。
https://useyourloaf.com/blog/unregistering-nsnotificationcenter-observers-in-ios-9/
我认为你应该使用代码
NSNotificationCenter.defaultCenter().removeObserver(self)
Run Code Online (Sandbox Code Playgroud)
解释:你在这里有错误:你正在使用 NSNotification 和 NSNotificationCenter,所以你必须使用上面的代码来删除观察。你已经使用 KVO 代码来删除观察者,所以它会出错。
您可以在此处阅读更多详细信息。键值观察
| 归档时间: |
|
| 查看次数: |
8663 次 |
| 最近记录: |