gpt4 book ai didi

objective-c - 什么时候使用 "willChangeValueForKey"和 "didChangeValueForKey"?

转载 作者:太空狗 更新时间:2023-10-30 03:09:47 25 4
gpt4 key购买 nike

我在一个演示项目中看到了这些行,但我不明白为什么会这样。

[self willChangeValueForKey:@"names"];
[self didChangeValueForKey:@"names"];

它在 willChangeValueForKey 之后立即调用了 didChangeValueForKey。有什么意义吗?

此外,什么时候调用这两个方法比较合适?非常感谢!! :)

最佳答案

事实上,这是一种反模式。你不应该调用 -willChangeValueForKey: 然后调用 -didChangeValueForKey: 没有任何干预的实际属性更改。在某些情况下,这样做可以掩盖代码中其他地方的 KVO 问题,并强制观察者更新与相关属性相关的状态。然而,最终,您(或您引用的示例的作者)应该修复其余代码,这样就不需要这种反模式了。

-will|didChangeValueForKey: 的正确用法是当您在不使用符合 KVC 的访问器/ setter 的情况下修改属性时,这样 KVO 机制就不会注意到更改。举一个人为的例子,考虑直接修改属性的支持实例变量:

@interface Foo
{
int bar;
}
@end

@implementation Foo
- (void)someMethod
{
bar = 10;
}
@end

已注册 bar 属性更改通知的 KVO 观察者将不会收到 -someMethodbar 的更改通知。要使 KVO 机制工作,您可以修改 -someMethod:

- (void)someMethod
{
[self willChangeValueForKey:@"bar"];
bar = 10;
[self didChangeValueForKey:@"bar"];
}

当然,最好使用 @property 声明并使用符合 KVC 的访问器/ setter (手动编码或@synthesized),但这是一个人为的例子。

关于objective-c - 什么时候使用 "willChangeValueForKey"和 "didChangeValueForKey"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3018242/

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