之前对于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方法
网友评论