KVC:NSKeyValueCoding
KVO:NSKeyValueObserver
KVO机制:当指定的对象的属性发生变化是主动通知另一个对象并触发相应的方法。
每当在在类中定义一个监听:
[self addObserver:self
forKeyPath:@"items" options:0 context:contexStr];
还可以监听其他对象的属性的变化
[person addObserver:money forKeyPath:@"account" options:0 context:contexStr];
只有当前类中items这个属性发生的变化都会触发到以下方法
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
KVO的优点:
当属性改变时,KVO会提供自动的消息通知。这样开发人员不需要自己去实现这样的方案:每次属性改变了就发送消息通知。
同时KVO可以支持多个观察者观察同一个属性,以及相关的值。
KVC的实现分析:
KVC使用了一个isa-swizzling技术。
isa-swizzling就是类型混合指针机制。KVC主要通过isa-swizzling,来实现其内部查找定位。isa指针,就是 is a kind of的意思,指向维护分发表的对象的类。该分发表实际上包含了指向实现类中的方法的指针和其他数据
KVC的代码:
[person setValue:@"personName" forKey:@"name"];
KVC在调用方法setValue的时候
(1)首先根据方法名找到运行方法的是偶所需要的环境参数。
(2)他会从自己isa指针结合环境参数,找到具体的方法实现的接口。
(3)再直接查找的来的具体的方法实现
当一个对象注册了一个观察者,被观察对象的isa指针被修改的时候,isa指针就会指向一个中间类,而不是一个真实地类。
所以isa指针其实不需要指向实例对象真实地类。所以我们的程序最好不要依赖于isa指针。在调用类的方法的时候,最好要明确对象实例的类名。
这样只有当我们调用KVC去访问key值的时候KVO才会起作用。所以KVO是基于KVC实现的。