使用都比较简单不需要更多的啰嗦,所以这里整理了一下他们的内部原理,这样会在使用的时候少一些bug
一、基本介绍
1. KVC,即 NSKeyValueCoding,一个非正式的Protocol,提供一种机制来间接访问对象的属性。KVO 就是基于 KVC 实现的关键技术之一。KVC赋值取值的顺序:
1. 用 KVC 取值或赋值,会优先调用这个属性的 setter 和 getter 方法来赋值。
2. 如果找不到 setter 和 getter 方法,则会优先查找带下划线的属性进行赋值。
3. 如果找不到带下划线的属性,则会查找不带下划线的属性进行赋值。
4. 如果都找不到,则会崩溃 : setValue: forUndefinedKey:
5. 要想在找不到key的时候不崩溃需要在.m中实现方法- (void)setValue:(id)value forUndefinedKey:(NSString *)key
2. KVO,即Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,对象就会接受到通知,前提是执行了setter方法、或者使用了KVC赋值,是Objective-C 对观察者设计模式的一种实现,另一种是通知机制。其内部实现原理是利用oc的runtime特性动态创建了一个子类,并重写了keypath的setter方法
-(void)setName:(NSString *)newName{
[self willChangeValueForKey:@"name"];//KVO在调用存取方法之前总调用
[super setValue:newNameforKey:@"name"];//调用父类的存取方法
[self didChangeValueForKey:@"name"];//KVO在调用存取方法之后总调用
}
二、与通知、代理的比较
KVO和Notification的比较:都是一对多,通知多了手动发送这一步;KVO适用于属性变化的监听,通知没有这个局限性
KVO及通知与Delegate的比较:代理可以获取返回值,代理是1V1的
网友评论