你需要调用willChangeValueForKey:和didChangeValueForKey:?

时间:2010-07-16 00:39:07

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

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

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

  // Safeguards 
  // ...

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

但是我在博客文章中看到很多代码,他们一直在做Cocoa的时间比我长得多,就像这样:

-(void) setFoo(Foo *)newFoo {

  // Safeguards 
  // ...

  // Switcheroo
  // ...
}

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

1 个答案:

答案 0 :(得分:13)

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

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