KVC与KVO的理解
2019-02-28 本文已影响0人
陌巷先森
一、KVC
KVC即是指NSKeyValueCoding,一个非正式的Protocol,提供一种机制来间接访问对象的属性,而不是通过调用setter、getter方法访问。其实现方法有两种:
- 使用字符串来描述对象需要更改的属性
//通过键值对来为对象属性赋值,主要为私有属性赋值
Student *stu = [Student new];
[stu setValue:@"KVC" forKey:@"name"];
//通过键值对取得对象属性的值
NSString *name = [stu valueForKey:@"name"];
- 使用键值对路径来描述对象需要修改的属性,keyPath就是用.号把一个个的key链接起来,根据路径进行访问
//如果对象A的属性是对象B,要为对象B的属性赋值可以通过键值对路径
_student = [Student new];
[self setValue:@"KVCPath" forKeyPath:@"student.name"];
//通过键值对路径获取对象B属性的值
NSString *pathName = [self valueForKeyPath:@"student.name"];
- 可以将字典转模型
//可以通过字典进行赋值,将字典转换成模型
NSDictionary *dic = @{
@"name":@"luna",
@"city":@"Beijing",
};
Person *p = [Person new];
[p setValuesForKeysWithDictionary:dic];
二、KVO
1.KVO介绍
KVO(Key-Value Observing)建立在KVC之上,通过对某个对象的某个属性添加观察者,当该属性改变,就会调用- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
方法,从而进行一些操作。
2.KVO原理
KVO通过创建一个当前类的派生类,重写该对象的setter方法,并且在setter方法中实现通知机制。通过修改当前类的isa指针,让其指向派生类。当调用setter方法时就会调用派生类的setter方法,从而激活键值通知机制。此外派生类还重写了delloc方法来释放资源。
3.KVO使用
/*
1.注册观察者
第一个参数是观察者对象,第二个参数是观察的键值路径,第三个参数是当值更新时返回的选项,第四个参数是文本内容
*/
[_student addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil];
/*
2.实现回调方法
*/
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
NSLog(@"KVO---keyPath:%@,object:%@,change:%@",keyPath,object,change);
}
/*
3.在不需要时移除观察者
*/
[_student removeObserver:self forKeyPath:@"name"];
参考:完整项目资料下载