在ARC下,我创建了一个我分配给属性的NSDictionary。然后,我将其设置为志愿的void *的上下文参数:如何在ARC下处理void *投射?
[obj addObserver:self
forKeyPath:kp
options:NSKeyValueObservingOptionNew
context:(void*)dict];
注:键 - 值观察的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不会抱怨,但我有一种感觉是错误的。
我同意上下文是为了传递一个标识符(地址或常量字符串)。 ARC编译器在从Objective-C类型转换为void *时不需要* bridged * cast'... context:(bridge void *)dict],这仍然很奇怪。 –