你需要调用willChangeValueForKey:和didChangeValueForKey:?

Sop*_*unk 9 cocoa objective-c key-value-observing

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

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

  // Safeguards 
  // ...

  [self willChangeValueForKey:@"foo"];
  // Switcheroo
  // ...
  [self didChangeValueForKey:@"foo"];
}
Run Code Online (Sandbox Code Playgroud)

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

-(void) setFoo(Foo *)newFoo {

  // Safeguards 
  // ...

  // Switcheroo
  // ...
}
Run Code Online (Sandbox Code Playgroud)

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

Yuj*_*uji 13

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

Mike Ash 的博客文章详细介绍了这种神奇的细节(isa-swizzling).这是魔法.基本上,当观察到密钥时,运行时会自动替换setter的实现,以便它调用KVO通知.