我有一些代码大量使用 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
}
是生产安全的,Apple 建议将其作为适当的异常处理模式。
异常,尤其是来自 Apple 内部 API 的异常,永远不应被静默地捕获和忽略。在 Objective-C 中,异常通常会导致您的应用程序终止,这与其他语言和运行时(Java、.NET)不同,在其他语言和运行时(Java、.NET)中,捕获异常是开发的正常部分。
如果您遇到崩溃,那么您在某处有一个错误,您需要修复它。由于进入不一致的状态,吞下异常可能会产生非常糟糕的后果。不要这样做。