kvo:key value observing
键值观察机制
通过kvo检测对象属性值的变化。
每次被观察的对象的属性发生改变时,kvo会自动的通知相应的观察者
使用步骤:
1 注册监听的对象,指定被观察对象的属性
2 实现回调方法。在观察者的类中实现回调方法,一旦被观察对象的属性发生改变,就会自动调用该回调方法
3 移除观察,解除监听对象
1.注册,添加观察者(用被观察者调用该方法)
/*
参数一:观察者
参数二:被观察的对象的属性
参数三:指定监听的操作,比如新值、初始化等
参数四:上下文,一般为nil,当keyPath相同时,可以设置不同的字符串用于区分
*/
[person.card addObserver:person forKeyPath:@"money" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
2.实现回调方法
#pragma mark - 2.实现回调方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{ NSLog(@"keyPath:%@,观察的对象 %@,改变的信息%@",keyPath,object,change); }
3.回收方法
- (void)dealloc{
[self.person removeObserver:self.person forKeyPath:@"money"];
}
kvc : key value coding键值编码
通过kvc对对象的属性进行间接的取值和赋值 不再使用访问器的方法
*/
Student *stu=[[Student alloc]init];
StuClass *stuClass=[[StuClass alloc]init];
//通过访问器的方法设置属性值
stu.num=1;
stu.name=@"apple";
stuClass.num=1;
stuClass.name=@"iOS";
stu.stuClass=stuClass;
//通过访问器的方法获取属性值
NSLog(@"学生的 学号%i,姓名%@,班级编号:%li,班级名称:%@",stu.num,stu.name,(long)stu.stuClass.num,stu.stuClass.name);
//kvc
[stu setValue:@1 forKey:@"num"];
[stu setValue:@"apple" forKey:@"name"];
[stu setValue:stuClass forKey:@"stuClass"];
//kvc使用keyPath时,用点连接属性名
[stu setValue:@1 forKeyPath:@"stuClass.num"];
[stu setValue:@"java" forKeyPath:@"stuClass.name"];
//对不存在的属性赋值,会报错
//解决方法:去对象的类中重写setValue:forUndefinedKey:
[stu setValue:@21 forKey:@"age"];
kvc方法取值
int num=[[stu valueForKey:@"num"]intValue];
NSString *name=[stu valueForKey:@"name"];
int c_num=[[stu valueForKeyPath:@"stuClass.num"]intValue];
NSString *c_name=[stu valueForKeyPath:@"stuClass.name"];
NSLog(@"学生的 学号%i,姓名%@,班级编号:%i,班级名称:%@",num,name,c_num,c_name);
//数组
NSMutableArray * temArray=[NSMutableArray array];
for (int i=0; i<10; i++) {
Test * test=[[Test alloc] init];
[test setValue:@(100-arc4random()%10*2) forKey:@"score"];
[temArray addObject:test];
}
[stu setValue:temArray forKey:@"testArray"];
[stu showTestInfo];