oc的kvc和kvo

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


 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值