【问题标题】:Do you need to call willChangeValueForKey: and didChangeValueForKey:?需要调用 willChangeValueForKey: 和 didChangeValueForKey: 吗?
【发布时间】:2010-07-16 00:39:07
【问题描述】:

我认为自制的@property setter 应该是这样的:

-(void) setFoo:(Foo *)newFoo {

  // Safeguards 
  // ...

  [self willChangeValueForKey:@"foo"];
  // Switcheroo
  // ...
  [self didChangeValueForKey:@"foo"];
}

但我在 Cocoa 开发时间比我长很多的人的博客文章中看到了很多代码,如下所示:

-(void) setFoo(Foo *)newFoo {

  // Safeguards 
  // ...

  // Switcheroo
  // ...
}

所以我的问题是,我们需要调用 KVO 通知方法吗?或者,如果您使用的是现代运行时,它会在您更新私有 iVar 时神奇地完成吗?

【问题讨论】:

    标签: objective-c cocoa key-value-observing


    【解决方案1】:

    除非您选择退出,否则它会神奇地完成。阅读 KVO 指南的this section。请注意,KVC/KVO 从远古时代就存在(即在引入@property 之前),因此设置器是否为@synthesized 并不重要。它甚至与新旧运行时二分法无关。

    Mike Ash 在blog post 中详细介绍了这种魔法(isa-swizzling)的细节。这是魔法。基本上,当观察到一个键时,运行时会自动替换 s​​etter 的实现,以便调用 KVO 通知。

    【讨论】:

    • KVO 指南链接失效((
    猜你喜欢
    • 1970-01-01
    • 2015-09-08
    • 2018-03-31
    • 2010-12-07
    • 2021-08-11
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    • 2020-07-03
    相关资源
    最近更新 更多