我认为自制的@property setter 应该是这样的:
-(void) setFoo:(Foo *)newFoo {
// Safeguards
// ...
[self willChangeValueForKey:@"foo"];
// Switcheroo
// ...
[self didChangeValueForKey:@"foo"];
}
但是我在博客文章中看到很多代码,这些代码都是使用 Cocoa 的时间比我长得多的人写的,它们是这样的:
-(void) setFoo(Foo *)newFoo {
// Safeguards
// ...
// Switcheroo
// ...
}
所以我的问题是,我们需要调用 KVO 通知方法吗?或者,如果您使用的是现代运行时,它是否在您更新私有(private) iVar 时神奇地完成了?
最佳答案
除非您选择退出,否则它会神奇地完成。阅读 this section KVO 指南。请注意,KVC/KVO 从远古时代就存在(即在 @property
引入之前),因此 setter 是否为 @synthesize
d 并不重要。它甚至与旧/新运行时二分法无关。
这个魔法(isa-swizzling)的细节在 blog post 中有详细说明。迈克·阿什。这是魔法。基本上,当观察到一个键时,运行时会自动替换 setter 的实现,以便它调用 KVO 通知。
关于objective-c - 你需要调用 willChangeValueForKey : and didChangeValueForKey:?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3261139/