关于KVC、KVO

时间:2022-02-15 21:51:07

KVC/KVO

--------------------KVC--键值编码-------------------
作用:
通过字符串来描述对象的属性间接修改对象的属性

Student *stu=[[Student alloc]init];//实例化Student 对象
Student 成员变量:name ,age, book
Book 成员变量 price

1 修改price属性

[stu setValue @“10.3”forKey:@“age”]

1.0获取属性值
[stu valueForkey:@"age"];

2 批量修改属性

[stu setValuesWithDictionary:@ {@"age":@"22",@"name":@"傻强"}];
2.0获取批量值(返回值字典)
NSArray *array= [stu dictionaryWithValues:@[@"age",@"name"]];

3 修改属性对象的属性
stu.book=[[BOOK alloc]init];

[stu.book setValue:@10.7 ForKey:@"price"];
[stu setValue:@"10.7" ForKeyPath:@"book.price"];

4 直接获取数组中所有对象的name属性值(name为对象的属性)

Student *stu1=[[Student alloc]init];
Student *stu2=[[Student alloc]init];
Student *stu3=[[Student alloc]init];
NSArray *array=@[stu1,stu2,stu3];

NSArray *nameArray=[array valueForKeyPath:@"name"];

5 直接获取数组中所有对象的price属性值的和(price为对象的属性对象book的属性)

stu1.book=[[BOOK alloc]init];
stu1.book.price=15;

stu2.book=[[BOOK alloc]init];
stu2.book.price=20;

stu3.book=[[BOOK alloc]init];
stu3.book.price=25;
NSArray *sumPrice=@[stu1,stu2,stu3];

id sum=[sumPrice valueForKeyPath:book.@sum.price];

--------------------KVO--键值监听-------------------

作用:
监听对象的属性的变化

下面以用Student对象来监听BOOK对象的price属性值的变化为例
------------------BOOK.m------------------------
BOOK *book=[[BOOK alloc]init];
book.price=10;//price原来的值

Student *stu=[[Student alloc]init];
//添加监听器
[book addObserver:stu forKeyPath:@"price" options:NSKeyValueObserverOptionNew |NSKeyValueObserverOptionOld context:nil];
//book:添加监听器者,stu:被添加监听器者,price:监听对象的什么属性,options:监听类型 context:上下文,这里暂时不需要,可填写为空;

book.price=50;//price变化后的值

//移出监听器
[book removeObserver:stu forKeyPath :@"price"]

------------------Student.m------------------

//当所监听的属性发生改变的时候,会调用这个方法

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

//keyPath:被监听的属性,这里为name。
//object:哪个对象的属性,这里为book。
//change :属性值变化为什么(字典),这里为old=10,new=50.
//context:上下文为nil。

}