3

在ARC下,我创建了一个我分配给属性的NSDictionary。然后,我将其设置为志愿的void *的上下文参数:如何在ARC下处理void *投射?

[obj addObserver:self 
     forKeyPath:kp 
     options:NSKeyValueObservingOptionNew 
     context:(void*)dict]; 

KVO programming guide指出:

注:键 - 值观察的addObserver:forKeyPath:选项:背景: 方法不保持对观察对象,观察对象或上下文的强烈引用。你应该确保你保持对观察和观察的对象 和必要的上下文的强烈参考。

因此,它不具有强烈的字典参考。我认为ARC在这方面没有问题,因为它只是一个参数。

当我得到的回调我提取字典是这样的:

- (void)observeValueForKeyPath:(NSString *)keyPath 
         ofObject:(id)object 
         change:(NSDictionary *)change 
         context:(void *)context { 

    NSDictionary *dict = (__bridge NSDictionary*)context; 
    //... 

} 

所以我记得有渔获量与ARC和无效*,我认为它是当你施放的空隙用__bridge *到一个Objective-C对象指针类型时,您不必在手动保留计数代码时调用-release。因为我在这里没有创建所有权,所以我只是做__bridge,所以ARC不会将其过度释放。

但我必须做一些特殊的ARC来设置字典作为参数? Xcode不会抱怨,但我有一种感觉是错误的。

回答

0

基本上下文不是为了传递一个对象,而是为了传递一个标识符(比如一个地址),以便可以识别出特定的项目。

这与NSNotification不同,它可以传递声明为object:(id)anObject而不是context:(void *)context的对象。

SO answer by @nall

当您注册通知,您还可以指定一个context 值。最后一个值就是这个值返回给你。如果 没有任何特定于上下文的信息,则将nil传递给 addObserver:是适当的。

参见:Mike Ash on "context"

+0

我同意上下文是为了传递一个标识符(地址或常量字符串)。 ARC编译器在从Objective-C类型转换为void *时不需要* bridged * cast'... context:(bridge void *)dict],这仍然很奇怪。 –

0

我觉得像你的基本假设是错误的,在电弧不关心无效*在所有和您还没有传递的对象引用(在这种情况下它只是一个指针)...... ARC没有工作要做。