oc的kvc和kvo
2015-04-16 22:27
232 查看
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
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
相关文章推荐
- OC学习篇之---KVC和KVO操作
- IOS开发-OC学习-kvc,kvo
- [oc学习日记]kvc,kvo和通知
- 【OC语言连载十】KVC、KVO、谓词
- OC高级语法之KVC和KVO的学习
- OC 中的KVC和KVO
- OC学习:KVC和KVO
- iOS开发-Day24-OC KVC&KVO&通知
- OC中的KVC和KVO(一)
- OC-设计模式KVC+KVO定义及使用
- OC中的KVC和KVO(二)
- oc中KVC,KVO,通知的使用
- QF——OC中的KVC,KVO
- OC-KVC/KVO
- OC之KVC、KVO 学习
- OC的KVC和KVO机制
- OC语法之KVC与KVO
- oc语言第九课 KVC、KVO与谓词——ios学习连载14
- OC中的KVC和KVO
- OC&nbsp;之&nbsp;KVO、KVC、通知(笔记)