@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) {}
}
}
}