KVC和KVO

本文介绍了KVC(Key Value Coding)和KVO(Key Value Observing)的概念。KVC用于通过键值访问对象属性,支持字典到模型的转换,取值操作以及模型到字典的转换。KVO则允许对象监听并响应其他对象属性的变化,当属性值改变时触发回调。
摘要由CSDN通过智能技术生成

1.什么是KVC?KVO?

KVC:Key Value Coding (键值编码)


//Person.h文件
@property (nonatomic,copy) NSString *name;
@property (nonatomic,assign) int age;

//常规赋值
Person *p = [[Person alloc] init];
p.name = @"zs";
p.age = 18;

//KVC赋值
[p setValue:@"王五" forKey:@"name"];
[p setValue:@"19" forKeyPath:@"age"];

注意:
1.使用KVC可以进行自动类型转换

forKey和forKeyPath的区别:

//Person.h文件

@property (nonatomic,strong) Dog *dog;

//main文件
Person *p = [[Person alloc] init];
[p.dog setValue"ahsh" forKeyPath:@"name"];
[p.dog setValue:@"hsff" forKey:@"name"];
[p setValue:@"ahsjhf" forKeyPath:@"dog.name"];

总结:
(1)forKeyPath 包含了所有 forKey的功能
(2)forKeyPath 可以进行内部点语法,层层访问内部属性
注意:key值一定要在属性中找到

修改内部的私有的成员变量

//person.h
@implementation Person
int _age;
@end

Person *person = [[Person alloc] init];
[person setValue:20 forKey:@"_age"];

字典转模型

-(instancetype)initWithDict:(NSDictionary *)dict{
    //[dict enumerateKeysAndObjectUsingBlock:^(id _Nullable key, id _Nullable value, BOOL _Nullable stop){
         //[self setValue:value forKey:key];
    //}]
     等价于:
     [self setValuesForKeysWithDictionary:dict];
     //在开发中,不建议使用
     //字典中的key值必须在模型的属性中找到,一一对应才可以
     //如果模型中带有模型,这个方法不好使
     //应用场景:简单的字典转模型
}

取值操作

WLYPerson *person = [[WLYPerson alloc] init];
[person valueForKeyPath:@"name"];

模型转字典

WLYPerson *person = [[WLYPerson alloc] init];
[person dictionaryWithValuesForKeys:@[@"name",@"money"]];

可以取出数组中所有对象的属性

Person *person1 = [[Person alloc] init];
Person *person2 = [[Person alloc] init];
Person *person3 = [[Person alloc] init];
Person *person4 = [[Person alloc] init];
NSArray *arr = @[person1, person2, person3, person4];
NSArray *allPersonNames = [arr valueForKeyPath:@"name"];


原理:
去模型中查找有没有对应的属性的set方法,有的话就把value传给set方法,调用赋值
找不到的话,去模型中查找有没有对应的属性,有的话直接访问属性赋值
去模型中查找有没有_source属性,有的话直接访问属性赋值
找不到,就会直接报错

KVO: Key Value Observing (键值监听)

当某个对象的某个属性值发生改变的时候(用KVO监听)

XMGPerson *person = [[XMGPerson alloc] init];
person.name = @"张三";
person.name = @"李四";
person.name = @"王五";
/*
  作用:给对象绑定一个监听器(观察者)
  -Observer:观察者
  -KeyPath:要监听的属性
  -options:选项,方便方法中拿到属性值
*/
[person addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil];

[person removeObserver:self forKeyPath:@"name"];


-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id>)change context:(void *)context{


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值