5

我有一些使用KVO的代码很多,并且在多个地方有addObserver:forKeyPath:removeObserver:forKeyPath:。该应用程序偶尔会崩溃,“无法删除关键路径的观察者”。从[NSObject removeObserver:forKeyPath:]捕获异常安全吗?

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

+2

您应该尝试首先了解故障的性质,然后决定是否可以忽略它。尝试/ catch将有助于如果你决定如此:http://stackoverflow.com/questions/1582383/how-can-i-tell-if-an-object-has-a-key-value-observer-attached – Tala

回答

5

例外情况,特别是来自内部Apple API的情况不应该被默默地捕获并忽略。在Objective-C中,异常应该通常会导致您的应用程序终止,而不像其他语言和运行时(Java,.NET),捕获异常是开发的正常组成部分。

如果你遇到了崩溃,你有一个错误的地方,你需要修复它。由于进入不一致的状态,吞吞一个异常可能会有非常糟糕的后果。不要这样做。

+0

因此,你的建议是清理代码,即使它需要额外的时间并延迟发布?就像我提到的,我明白我需要修复我的代码。只是试图在这一点上制定经济。谢谢 –

+1

@JihoKang所以你想发布一个有明显错误的应用程序?你甚至知道效果会是什么?目前该应用正在崩溃;当你吞下异常时,你认为你的应用会做什么? – Abizern

+0

@Abizern我正在开发的这个项目相当有时间限制,并且崩溃漏洞(就我所见过的beta版测试者而言)仅在5%的时间内出现。我编写了代码,以便有时间问题,其中已经从KVO注销的对象将尝试再次取消注册。我测试过捕获“无法删除关键路径的观察者”。没有副作用的例外情况“据我所见”,但只是想知道它可能是一个多么严重的问题。毕竟Mike提到这是Java中的常见做法。 –

3

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

例如:

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

是生产安全的,并且苹果公司建议作为适当的异常处理模式。