zoukankan      html  css  js  c++  java
  • KVC与KVO

    KVC:(key value coding):提供了一种使用字符串而不是访问器的方式访问属性值的机制

    //给对象属性赋值:首先查找类中setName方法,如果没有,去查找类中_name的成员变量,再去查找name变量

        [_playList setValue:@"like" forKey:@"name"];

    //字典中的key和value,当_playList对象中没有setId:方法,没有id变量,也没有_id变量,为自动执行setValue:forUndefinedKey:方法,将id所对应的key赋值给对象的pid

        [_playList setValue:@"1001" forKey:@"id"];

    //给某个成员的成员赋值

        [_playList setValue:@"北京北京" forKeyPath:@"currentItem.name"];

    将字典中各个key所对应的value赋给对象对应的属性,如果对象没有对应的属性,会自动调用setValue:forUndefinedKey:方法,需要我们重写此方法

    [_playList setValuesForKeysWithDictionary:dic];

    KVO:(key value observer):A类中的某个属性值发生变化,B类的对象做为A类对象的观察者,能够观察到此变化,并进⾏后续的处理。

    为_playList增加一个观察者self,当_playList的name属性值发生变化时,self通过回调方法进行后续的处理

    options是观察的选项(值变化:新值、旧值)

    context:被观察者给观察者发送的数据,也可以为nil

    [_playList addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];

    //回调函数,当被观察者的属性值发生变化时调用的

    //keyPath:被观察的属性,object:被观察的对象,change:是变化前和变化后的值的字典,context:被观察者传递的数据

    -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

    {

        //如果被观察的对象是_playList

        if([object isKindOfClass:[PlayList class]]){

            //如果是name属性值发生变化

            if([keyPath isEqualToString:@"name"]){

                //取出name的旧值和新值

                NSString *oldName=[change objectForKey:@"old"];

                NSString *newName=[change objectForKey:@"new"];

                NSLog(@"object:%@,old:%@,new:%@",object,oldName,newName);

            }

        }

    }

    http://www.cnblogs.com/PaulpauL/ 版权声明:本文为博主原创文章,未经博主允许不得转载。
  • 相关阅读:
    F
    D
    J
    M
    H
    L
    Android线程之间的通讯
    Java4Android基础学习之异常
    Java4Android基础学习之接口
    Java4Android基础学习之包与访问权限
  • 原文地址:https://www.cnblogs.com/PaulpauL/p/4935134.html
Copyright © 2011-2022 走看看