从[NSObject removeObserver:forKeyPath:]中捕获异常是否安全?

Jih*_*ang 6 cocoa objective-c key-value-observing nsnotificationcenter ios

我有一些使用KVO的代码,并且在多个地方都有addObserver:forKeyPath:removeObserver:forKeyPath : . 该应用程序偶尔会崩溃"无法移除观察者的关键路径".

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

Mik*_*ler 6

不应该默默地捕获和忽略异常,特别是来自内部Apple API的异常.在Objective-C中,异常通常会导致应用程序终止,这与其他语言和运行时(Java,.NET)不同,其中捕获异常是开发的正常部分.

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

  • @Abizern抱歉,我不同意这一点,并同意[NSHipster(Mattt Thompson)的帖子](http://nshipster.com/key-value-observing/) (2认同)

Yup*_*up. 5

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

例如:

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

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