Objective c 查看关键值观察值

Objective c 查看关键值观察值,objective-c,key-value-observing,Objective C,Key Value Observing,我如何知道我的目标是什么 我能找出我是否已经在观察的唯一方法就是试着移除观察结果。如果抛出异常,那么我没有观察到 for (AVPlayerItem *item in itemsToRemove) { @try{ [item removeObserver:self forKeyPath:@"status" context:(__bridge void *)(foo)]; }@catch(id anException){ //wasn't obser

我如何知道我的目标是什么

我能找出我是否已经在观察的唯一方法就是试着移除观察结果。如果抛出异常,那么我没有观察到

for (AVPlayerItem *item in itemsToRemove) {
    @try{
        [item removeObserver:self forKeyPath:@"status" context:(__bridge void *)(foo)];
    }@catch(id anException){
        //wasn't observing
    }
}

编辑:我正在考虑使用我自己的字典来跟踪观察结果,但这似乎是多余的,因为某个地方确实存在KVO字典。不幸的是,没有API访问。

似乎除了捕获异常之外没有其他选择,即使是NSHipster。然而,至少在我的情况下,几乎不需要进行检查。毕竟,你是控制观察者的人

您可以使用一个包装器(如),它为原始KVO添加了更多的健全性(并使观察变得更容易,允许使用块)。除其他功能外,它在尝试删除不存在的观察者时不会崩溃:

 @discussion If not observing object key path, or unobserving nil, this method results in no operation.
 */
- (void)unobserve:(id)object keyPath:(NSString *)keyPath;

似乎除了捕获异常之外没有其他选择,即使是NSHipster。然而,至少在我的情况下,几乎不需要进行检查。毕竟,你是控制观察者的人

您可以使用一个包装器(如),它为原始KVO添加了更多的健全性(并使观察变得更容易,允许使用块)。除其他功能外,它在尝试删除不存在的观察者时不会崩溃:

 @discussion If not observing object key path, or unobserving nil, this method results in no operation.
 */
- (void)unobserve:(id)object keyPath:(NSString *)keyPath;

似乎除了捕获异常之外没有其他选择,即使是NSHipster。然而,至少在我的情况下,几乎不需要进行检查。毕竟,你是控制观察者的人

您可以使用一个包装器(如),它为原始KVO添加了更多的健全性(并使观察变得更容易,允许使用块)。除其他功能外,它在尝试删除不存在的观察者时不会崩溃:

 @discussion If not observing object key path, or unobserving nil, this method results in no operation.
 */
- (void)unobserve:(id)object keyPath:(NSString *)keyPath;

似乎除了捕获异常之外没有其他选择,即使是NSHipster。然而,至少在我的情况下,几乎不需要进行检查。毕竟,你是控制观察者的人

您可以使用一个包装器(如),它为原始KVO添加了更多的健全性(并使观察变得更容易,允许使用块)。除其他功能外,它在尝试删除不存在的观察者时不会崩溃:

 @discussion If not observing object key path, or unobserving nil, this method results in no operation.
 */
- (void)unobserve:(id)object keyPath:(NSString *)keyPath;

在您向控制器添加一些布尔标志并使用它来标记和检查您的控制器是否注册了KVO之前,无法知道这一点。通常,您应该从KVO观察中平衡注册和注销

在ARC下使用异常是错误的,并且可能会导致内存泄漏,直到您使用
-fobjc ARC exceptions


长话短说:异常是昂贵的,这就是为什么在您明确询问之前ARC不能正确处理它们的原因。对此有一个解释:

除非您向控制器添加一些布尔标志,并使用它来标记和检查您的控制器是否注册了KVO,否则无法知道这一点。通常,您应该从KVO观察中平衡注册和注销

在ARC下使用异常是错误的,并且可能会导致内存泄漏,直到您使用
-fobjc ARC exceptions


长话短说:异常是昂贵的,这就是为什么在您明确询问之前ARC不能正确处理它们的原因。对此有一个解释:

除非您向控制器添加一些布尔标志,并使用它来标记和检查您的控制器是否注册了KVO,否则无法知道这一点。通常,您应该从KVO观察中平衡注册和注销

在ARC下使用异常是错误的,并且可能会导致内存泄漏,直到您使用
-fobjc ARC exceptions


长话短说:异常是昂贵的,这就是为什么在您明确询问之前ARC不能正确处理它们的原因。对此有一个解释:

除非您向控制器添加一些布尔标志,并使用它来标记和检查您的控制器是否注册了KVO,否则无法知道这一点。通常,您应该从KVO观察中平衡注册和注销

在ARC下使用异常是错误的,并且可能会导致内存泄漏,直到您使用
-fobjc ARC exceptions


长话短说:异常是昂贵的,这就是为什么在您明确询问之前ARC不能正确处理它们的原因。对此有一个解释:

这里你可以看到一个例子和观察火灾的两种方法。@OnikIV OP不是问如何观察。他问如何知道他是否在观察。是的@Rob,如果他阅读了所有发布的答案,他会比你观察一些属性时看到这个方法:“-(void)observeValueForKeyPath:(NSString*)对象的关键路径:(id)对象更改:(NSDictionary*)更改上下文:(void*)上下文{//这里你的操作取决于关键路径…}”被称为。换句话说,如果你不观察任何关键路径,这个方法就不会被调用。@OnikIV,OP无疑已经知道了。他在问一个更微妙的问题,而你的另一个答案并没有解决这个问题。他有一个设计,不知何故,他不知道观察者是否已经被添加,并且询问如何有条件地删除观察者,当且仅当观察者之前被添加时。(就我个人而言,我会保留一个状态变量,而不是使用try/catch技术。)但让他参考关于如何添加和使用观察者的答案(尤其是不考虑移除观察者的答案)从根本上误解了眼前的问题。感谢您澄清@Rob。我曾考虑添加自己的字典,但使用try/catch简洁地解决了崩溃问题。你说的状态变量是什么意思?如果[自动观察者]?在这里你可以看到一个例子和两种观察火的方法。@OnikIV OP并没有问如何观察。他问如何知道他是否在观察。是的@Rob,如果他阅读了所有发布的答案,他会比你观察一些属性时看到这个方法:“-(void)observeValueForKeyPath:(NSString*)对象的关键路径:(id)对象更改:(NSDictionary*)更改上下文:(void*)上下文{//这里你的操作取决于关键路径…}”被称为。换句话说,如果y