OC中 KVC 与 KVO的区别

之前对于KVC、KVO一直停留在概念层,很少去用到或者去仔细看怎么实现,昨天特意去查了一下相关的技术博客,自己学习的心得写一下:

一.  KVO 监听机制的建立:

1. 设置观察者对象,使用的方法是:

- (void)addObserver:(NSObject*)observer forKeyPath:(NSString*)keyPath options:(NSKeyValueObservingOptions)options context:(void*)context;

各个参数解释:*@param observer 观察者(监听器)

                         *@param keyPath  属性名(要观察的属性)

                         *@param options

                         *@param context  传递的参数

2. 设置监听事件:使用的方法是:

- (void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context

各个参数解释:*@param keyPath 哪个属性被改了

                         *@param object  哪个对象的属性被改了

                         *@param change  改成咋样

                         *@param context 当初addObserver时的context参数值

3. 取消监听:最好放在dealloc方法中

-(void)dealloc{    

[premoveObserver:selfforKeyPath:@"test"];

}

二、KVC就是键值编码,根本就是通过key获取想要的值Value 或者通过Key 设置相应的Value,而不是通过Setter、Getter方法访问

KVC的主要作用有: 1. 访问私有变量 

                                  2. 使用KVC直接访问NSArray 或者NSSet的属性值 

                                  3. 使用KVC将字典转化为Model 

KVC 主要的方法有:

获取值

valueForKey: 传入NSString属性的名字。

valueForKeyPath: 属性的路径,xx.xx

valueForUndefinedKey 默认实现是抛出异常,可重写这个函数做错误处理

修改值

setValue:forKey:

setValue:forKeyPath:

setValue:forUnderfinedKey:

setNilValueForKey: 对非类对象属性设置nil时调用,默认抛出异常。


总结:

            1.KVO底层实现原理是系统给当前类创建子类,在子类setter 方法调用父类的setter方法

你可能感兴趣的:(OC中 KVC 与 KVO的区别)