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