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);

        }

    }

}

posted @ 2015-11-04 10:03  BuddyLiu  阅读(212)  评论(0编辑  收藏  举报