在ARC下,我创建了一个我分配给属性的NSDictionary。然后我将其设置为KVO的void * context参数:
[obj addObserver:self
forKeyPath:kp
options:NSKeyValueObservingOptionNew
context:(void*)dict];
注意:键值观察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没有抱怨,但我感觉有些不对劲。
答案 0 :(得分:0)
基本上,上下文不是用于传递对象,只是为了传递标识符(例如地址),以便可以识别特定项目。
这与NSNotification
不同,object:(id)anObject
可以传递声明为context:(void *)context
的对象,而不是{{1}}。
注册通知时,您还可以指定上下文 值。最后一个值就是返回给您的这个值。如果你 没有任何特定于上下文的信息,传递给nil addObserver:是合适的。
答案 1 :(得分:0)
我觉得你的基本假设是错误的,因为弧根本不关心void *你也没有传递对象的引用(在这个上下文中它只是一个指针)...... ARC没有工作要做。