首页 > 代码库 > 我所认为的KVC和KVO
我所认为的KVC和KVO
引子:
? 为什么要写这个,只是突然一个念头闪现,说一下本人目前理解。
KVC:
? Key-value coding,它是一种使用字符串标识符,间接访问对象属性的机制。但是关就这一点来说,这么久以来确实没怎么体会到用这个的好处,我没有明显的理由用setValut:forKey 而不是直接用一个属性。当然,KVC是KVO实现的基础,这个基础究竟是什么?下来道来
KVO:
?KVO其实就是一种观察者模式的实现。两个角色:被观察者A和观察者B。假如B观察A的某一个属性,那么当A的这个属性值发生改变的时候就会通知B。那么基本原理可以认为是只要A的被监听属性发生变化就会调用B的 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context;来通知B。
这个属性变化有两种可能:一是通过调用属性(直接调用setter或KVC寻找到setter)改变,二是通过KVC直接改变属性对应的实例变量。后者显然是不可行的,改变的时候不具备一个发送通知的时机。那么只有第一种情况,但是要在setter方法里面发送通知,原生的属性并没有实现这个功能,所以系统的做法是当对象A被监听的时候就创建一个该类Class_A对应的派生类Class_KVO_A(注:类名只为示意),然后重写被监听属性的setter方法,被重写的setter具有发送通知的能力,然后把对象A的isa指针指向Class_KVO_A,那么以后当A的被观察属性改变的时候就会调用Class_KVO_A的setter方法改变值并且向观察者B发送通知。至于说KVC是KVO的基础,个人感觉KVO用到KVC的一点也就是可以通过[setValue:forKey]同样可以找到setter方法,如果KVC是KVO的基础,那没有KVC是不是KVO就不能实现了?但是显然不是这样的,没有KVC只是不能通过[setValue:forKey]这样的方式去改变属性值而已。
@mic
(Email:yrs244742688@gmail.com)
(QQ:839720759)