gpt4 book ai didi

ios - 如何处理 ARC 下的 void* cast?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:41:18 25 4
gpt4 key购买 nike

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

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

KVO programming guide指出:

Note: The key-value observing addObserver:forKeyPath:options:context: method does not maintain strong references to the observing object, the observed objects, or the context. You should ensure that you maintain strong references to the observing, and observed, objects, and the context as necessary.

所以它没有对 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 没有提示,但我觉得有什么不对劲。

最佳答案

context基本上不是为了传递一个对象,只是为了传递一个标识符(比如地址),以便识别具体的item。

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

来自 SO answer by @nall :

When you register for the notification you can also specify a context value. The last value is simply this value returned to you. If you don't have any context-specific information, passing nil to addObserver: is appropriate.

参见:Mike Ash on "context"

关于ios - 如何处理 ARC 下的 void* cast?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19343889/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com