我回答关于基金会魔法这个问题:What's the most *simple* way to implement a plain data object which conforms key-value-observing?Key-Value Observing如何在内部实现?
有什么魔力?它如何在内部工作?因为使用我无法理解其内部行为的框架是危险的,所以我想知道它的行为。目前,我无法理解如何在没有任何方法定义的情况下工作。
我回答关于基金会魔法这个问题:What's the most *simple* way to implement a plain data object which conforms key-value-observing?Key-Value Observing如何在内部实现?
有什么魔力?它如何在内部工作?因为使用我无法理解其内部行为的框架是危险的,所以我想知道它的行为。目前,我无法理解如何在没有任何方法定义的情况下工作。
Apple的documentation描述了KVO如何在内部实现。
它的要点是,当你在一个对象上注册一个观察者时,该框架动态地创建该对象的原始类的一个子类,并将该对象调整为这个新动态类的一个实例。如果您在调试器中有一个观察者注册后检查对象,则可以看到这一点。
这个新类拦截到对象的消息,并检查它们是否匹配某些模式(如getters,setters和collection访问)。
简而言之:Objective-C 2.0的@property声明为named属性创建访问器方法,所以是方法定义。 @property只是定义它们的简便方法,它避免了许多重复的样板代码。
当您观察一个属性时,将创建一个私有子类,该子类实现在更改属性值之前和之后调用相应通知方法的访问器。然后使用称为“isa swizzling”的技术来改变观察对象的类别。