对于这个问题,我得到了有关Foundation 魔法的答案:实现符合键值观察的普通数据对象的最简单*方法是什么?
有什么魔力?它在内部如何运作?因为使用我无法理解其内部行为的框架很危险,所以我想知道它的行为。目前,如果没有任何方法定义,我无法理解它是如何工作的。
对于这个问题,我得到了有关Foundation 魔法的答案:实现符合键值观察的普通数据对象的最简单*方法是什么?
有什么魔力?它在内部如何运作?因为使用我无法理解其内部行为的框架很危险,所以我想知道它的行为。目前,如果没有任何方法定义,我无法理解它是如何工作的。
Apple 的文档描述了如何在内部实现 KVO。
它的要点是,当您在对象上注册观察者时,框架会动态创建对象原始类的子类,并调整对象以显示为这个新动态类的实例。如果在调试器注册了观察者后在调试器中检查对象,则可以看到这一点。
这个新类拦截到对象的消息并检查它们是否匹配某些模式(例如 getter、setter 和集合访问)。
简而言之:Objective-C 2.0 的 @property 声明为命名属性创建访问器方法,因此有方法定义。@property 只是定义它们的一种简写方式,它避免了许多重复的样板代码。
当您观察一个属性时,会创建一个私有子类,该子类实现在更改属性值之前和之后调用适当通知方法的访问器。然后使用一种称为“isa swizzling”的技术来改变观察对象的类别。