objective-c - 你需要调用 willChangeValueForKey : and didChangeValueForKey:?

标签 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 通知方法吗?或者,如果您使用的是现代运行时,它是否在您更新私有(private) iVar 时神奇地完成了?

最佳答案

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

这个魔法(isa-swizzling)的细节在 blog post 中有详细说明。迈克·阿什。这是魔法。基本上,当观察到一个键时,运行时会自动替换 s​​etter 的实现,以便它调用 KVO 通知。

关于objective-c - 你需要调用 willChangeValueForKey : and didChangeValueForKey:?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3261139/

相关文章:

objective-c - 以编程方式更改为其他空间 (MacOSX)

ios - 为 NSManagedObject 子类的属性构建一个灵活的编辑表单

objective-c - KVO : +keyPathsForValuesAffecting<Key> doesn't work with (subclass of) NSObjectController

ios - UIImageView 之间的碰撞检测

iphone - 如何在 Cocoa/Objective-C 中编写一个简单的 Ping 方法

cocoa:当我调用toggleFullScreen方法时,如何返回?

ios - KVO 不应该同步工作吗?

iphone - 这个方法有什么问题吗?

ios - UISlider 拇指在不接触拇指的情况下移动

cocoa - MonoMac 中的 NSReadPixel 在哪里?