@try @catch 方法

移除KVO观察者

当一个观察者完成了监听一个对象的改变,需要调用 –removeObserver:forKeyPath:context:。它经常在 -observeValueForKeyPath:ofObject:change:context:,或者 -dealloc 中被调用。

如果你调用 –removeObserver:forKeyPath:context: 移除一个观察者对象,但这个对象没有被注册为观察者(因为它已经解注册了或者开始没有注册),则会抛出一个异常。Objective-C 中,没有一个内建的方式来检查对象是否注册,这会导致我们需要用一种相当不好的方式 @try 和一个没有处理的 @catch,如下所示:

- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary *)change
                       context:(void *)context
{
    if ([keyPath isEqualToString:NSStringFromSelector(@selector(isFinished))]) {
        if ([object isFinished]) {
          @try {
              [object removeObserver:self forKeyPath:NSStringFromSelector(@selector(isFinished))];
          }
          @catch (NSException * __unused exception) {}
        }
    }
}

posted on 2016-01-18 16:04  时光机728  阅读(319)  评论(0编辑  收藏  举报

导航