【问题标题】:Is it safe to catch an exception from [NSObject removeObserver:forKeyPath:]?从 [NSObject removeObserver:forKeyPath:] 捕获异常是否安全?
【发布时间】:2013-08-18 16:00:58
【问题描述】:

我有一些代码大量使用 KVO,并且在多个地方都有 addObserver:forKeyPath:removeObserver:forKeyPath:。应用程序偶尔会因“无法删除关键路径的观察者”而崩溃。

我想知道尝试/捕获异常以防止应用程序崩溃是否安全。我知道这不是处理 KVO 的最佳方法,但我需要花一些时间才能清理代码。

【问题讨论】:

标签: ios objective-c cocoa key-value-observing nsnotificationcenter


【解决方案1】:

异常,尤其是来自 Apple 内部 API 的异常,绝不能被静默地捕捉和忽略。在 Objective-C 中,异常通常会导致您的应用终止,这与其他语言和运行时(Java、.NET)不同,在这些语言和运行时(Java、.NET)中,捕获异常是开发的正常部分。

如果您遇到崩溃,则说明您在某处存在错误,您需要修复它。由于进入不一致的状态,吞下异常可能会产生非常糟糕的后果。不要这样做。

【讨论】:

  • 所以你的建议是清理代码,即使它确实需要额外的时间并延迟发布?就像我提到的那样,我确实明白我需要修复我的代码。只是试图在这一点上解决经济问题。谢谢
  • @JihoKang 所以你想发布一个有明显错误的应用程序?你甚至知道会有什么影响吗?现在应用程序正在崩溃;当您吞下异常时,您认为您的应用会做什么?
  • @Abizern 我正在处理的项目对时间非常关键,并且崩溃错误(据我在 beta 测试人员中看到的)仅在 5% 的时间内发生。我已经编写了代码,因此在某些情况下,由于时间问题,已经从 KVO 注销的对象将尝试再次注销。我已经测试了捕获“无法删除关键路径的观察者”。 “据我所知”没有副作用的例外,但只是想知道它可能对一个问题有多重要。毕竟,正如 Mike 提到的,这是 Java 中的常见做法。
  • @JihoKang 你不是在写Java。仍然 - 您的选择。
  • @Abizern 对不起,我不同意这个,同意NSHipster (Mattt Thompson)'s post
【解决方案2】:

是的,使用@try @catch 来解决这些KVO 冲突是完全可以接受的。

例如:

@try {
        [[NSNotificationCenter defaultCenter] removeObserver:self forKeyPath:UIDeviceProximityStateDidChangeNotification];
    }
@catch (NSException *exception) {
        // observer doesn't exist, do nothing
    }

是生产安全的,Apple 建议将其作为适当的异常处理模式。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-03-04
  • 1970-01-01
  • 2011-06-25
  • 2013-11-30
  • 1970-01-01
  • 2013-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多