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"];
//如果对象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"];

参考:完整项目资料下载

上一篇下一篇

猜你喜欢

热点阅读