如何处理ARC下的空洞*?

时间:2013-10-13 09:56:27

标签: ios objective-c memory-management automatic-ref-counting

在ARC下,我创建了一个我分配给属性的NSDictionary。然后我将其设置为KVO的void * context参数:

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

KVO programming guide表示:

  

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

所以它没有强烈的dict参考。我认为ARC对此没有任何问题,因为它只是一个论点。

当我收到回调时,我会像这样提取字典:

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

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

}

所以我记得有捕获ARC和void * ,我认为当你将void *转换为Objective-C对象指针类型时,使用__bridge是不必要的在手动保留计数代码中调用 -release 。因为我没有在这里创建所有权,所以我只做__bridge所以ARC不会过度发布它。

但是我必须为ARC做一些特别的事情来设置字典作为参数吗? Xcode没有抱怨,但我感觉有些不对劲。

2 个答案:

答案 0 :(得分:0)

基本上,上下文不是用于传递对象,只是为了传递标识符(例如地址),以便可以识别特定项目。

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

来自SO answer by @nall

  

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

请参阅:Mike Ash on "context"

答案 1 :(得分:0)

我觉得你的基本假设是错误的,因为弧根本不关心void *你也没有传递对象的引用(在这个上下文中它只是一个指针)...... ARC没有工作要做。