您的位置:首页 > 移动开发 > IOS开发

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

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  IOS OC 程序开发