我如何知道我的对象是键值观察的项目?
我能够发现我是否已经观察过的唯一方法是尝试删除观察结果。如果抛出异常,那么我就不会观察。
for (AVPlayerItem *item in itemsToRemove) {
@try{
[item removeObserver:self forKeyPath:@"status" context:(__bridge void *)(foo)];
}@catch(id anException){
//wasn't observing
}
}
编辑:我考虑使用自己的字典来跟踪观察,但这似乎是多余的,因为KVO字典确实存在于某处。不幸的是,没有API访问权限。
答案 0 :(得分:3)
似乎没有其他选择,除了捕捉异常,甚至NSHipster recommends to do so。但是,至少在我的情况下,几乎不需要进行检查。毕竟,你是控制观察者的人。
你可以使用一个包装器(如FBKVOController),它可以为原始KVO增加更多的理智(并使观察更容易,允许使用块)。除了其他功能之外,它在尝试删除不存在的观察者时不会崩溃:
@discussion If not observing object key path, or unobserving nil, this method results in no operation.
*/
- (void)unobserve:(id)object keyPath:(NSString *)keyPath;
答案 1 :(得分:0)
除非您向控制器添加一些布尔标志并使用它来标记并检查您是否注册了KVO,否则无法知道。通常,您应该平衡注册和取消注册KVO观察。
在ARC下使用异常很糟糕,在使用-fobjc-arc-exceptions
之前可能会导致内存泄漏。
长话短说:例外是昂贵的,这就是为什么ARC在你明确要求之前没有正确处理它们的原因。有一个解释:https://stackoverflow.com/a/4649234/351305