KVC(Key-Value-Coding),键值编码,是一种间接访问实例变量的方法
key:在这里是实例变量 的标识 比如 Teacher类的name
value:这里是实例变量的值 也就是实例变量的内容
常用方法:
setValue:forKey: 通过key给实例变量赋值
例如
定义一个对象
Teacher *teacher=[[Teacher alloc]init];
赋值
[teacher setValue:@"xiaoA" forkey:"name"];
取值
NSLog(@"%@",[teacher valueForkey:@"name"]);// 在这里打印
//用字典 采用kvc的方式给实例对象赋值
setValuesForKeysWithDictionary:dic
NSDictionary *dic=[NSDictionary dictionaryWithObjectsAndKeys:@"nihao",@"name",@"15",@"age", nil];
[teacher setValuesForKeysWithDictionary:dic];
//用这个方法可以捕获kvc里写错的key值(我是这么理解的:捕获set值的时候的异常)
(写在Teacher.m)里 可以当成是私有方法
ps:私有方法 只在.m文件里写实现,不在.h里边写定义 目的就是为了不让.m文件以外的文件使用 只能在本类使用
-(void)setValue:(id)value forUndefinedKey:(NSString *)key{
NSLog(@"key%@写错了",key);
}
KVO (观察者模式的一种)
现在我们再定义一个学生类 添加相同 的属性 name age score(分数) 然后添加初始化方法 便利构造器
然后再main函数里 实例化出一个Teacher 对象 和 Student 对象
这个时候 实现一个这个功能 : 当学生的分数少于 60 分的时候 老师那边就 给他的分数变为60分(老师比较好,不会让学生挂科)
下边利用KVO实现这个功能:
在这里 老师是观察者 学生是被观察者者
所有的活动的主动权都是学生来完成 的
1.被观察者主动 的去注册(添加观察者)
[stu addObserver:teacher forKeyPath:@"score" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:@"help"];
2.观察者的去实现方法 (Teacher.m)里(私有方法)
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
Student *stu=(Student *)object; //强制类型转换 将object转换成 Student
if ([[stu valueForKey:@"score"] intValue]<60) {
[stu setValue:[NSNumber numberWithInt:60] forKey:@"score"];
NSLog(@"加分成功,及格");
}
}
3.当学生的分数小于60分的时候就会主动调用老师的这个函数 给学生加分了
4.最后一步 移除观察者
[stu removeObserver:teache forKeyPath:@"score"];
附加:
sleep() //这个函数 是让主线程休眠 多少秒以后 执行
int,NSInterger 转换成NSNumber 的简写为 @(10); 这样就返回了 一个对象类型的 10