kvc:
Key-Value Coding(键值编码)是由 NSKeyValueCoding 非正式协议启用的一种机制,对象采用这种机制来提供对其属性/成员变量的间接访问。当一个对象符合键值编码时,它的所有属性/成员变量可以通过一个简洁、统一的消息传递接口(setValue:forKey:)通过字符串参数寻址。这种间接访问机制补充了实例变量及其相关访问器方法(getter 方法)提供的直接访问。
kvo:
KVO (自动键值观察)是通过 isa-swizzling (交换)实现的。基本的流程就是编译器自动为被观察者对象创造一个派生类(此派生类的父类是被观察者对象所属的类),并将被观察者对象的 isa 指向这个派生类(类名是 NSKVONotifying_XXX)。如果用户注册了对此目标对象的某一个属性的观察,那么此派生类会重写这个属性的 setter 方法,并在其中添加进行通知的代码。Objective-C 在发送消息的时候,会通过 isa 指针找到当前对象所属的类对象。而类对象中保存着当前对象可调用的实例方法,因此在向此对象发送消息时候,实际上是发送到了派生类对象的方法。由于编译器对派生类的方法进行了重写,并添加了通知代码,因此会向注册的观察者对象发送通知。注意派生类只重写注册了观察者的属性方法。