我有一些代码在大量使用KVO,并且在多个地方使用addObserver:forKeyPath:和removeObserver:forKeyPath:。应用程序偶尔会崩溃并显示“无法删除键路径的观察者”。
我想知道是否可以安全地尝试捕获异常以防止应用程序崩溃。我知道这不是处理KVO的最佳方法,但我需要在清理代码之前先争取一些时间。
我有一些代码在大量使用KVO,并且在多个地方使用addObserver:forKeyPath:和removeObserver:forKeyPath:。应用程序偶尔会崩溃并显示“无法删除键路径的观察者”。
我想知道是否可以安全地尝试捕获异常以防止应用程序崩溃。我知道这不是处理KVO的最佳方法,但我需要在清理代码之前先争取一些时间。
是的,使用@try @catch来解决这种KVO冲突问题是完全可以接受的。
例如:
@try {
[[NSNotificationCenter defaultCenter] removeObserver:self forKeyPath:UIDeviceProximityStateDidChangeNotification];
}
@catch (NSException *exception) {
// observer doesn't exist, do nothing
}
生产环境下的代码安全性是非常重要的,苹果公司建议采用适当的异常处理模式来确保代码的稳定性。
异常,特别是来自内部苹果API的异常,永远不应该被默默地捕获和忽略。在Objective-C中,异常通常会导致应用程序终止,而其他语言和运行时(如Java、.NET)则将捕获异常作为开发的正常部分。
如果您遇到崩溃,那么某处存在错误,您需要修复它。吞掉异常可能会由于进入一种不一致的状态而产生严重后果。不要这样做。