10

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

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

  // Safeguards 
  // ...

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

但是我在博客文章中看到了很多代码,这些代码是由比我做 Cocoa 的人的时间长得多的人写的,就像这样:

-(void) setFoo(Foo *)newFoo {

  // Safeguards 
  // ...

  // Switcheroo
  // ...
}

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

4

1 回答 1

14

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

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

于 2010-07-16T01:21:41.387 回答