oc为操作对象属性提供了两种方法来间接操作属性,kvc就是利用键值对来改写对象的属性值,类似字典,而kvo则提供了监控对象的某个属性值发生改变。
kvc and kvo
Person *p=[[Person alloc]init];
PersonObserver *ob=[[PersonObserver alloc] init];
Book *b=[[Book alloc]init];
b.name=@"abc";
Book *b1=[[Book alloc]init];
b1.name=@"ios";
Book *b2=[[Book alloc]init];
b2.name=@"java";
p.books=@[b,b1,b2];
p.book=b1;
//设置属性值
[p setValue:@"zhangsan" forKey:@"name"];
//键路径设置
[p setValue:@"iso" forKeyPath:@"book.name"];
//获取值
NSString *name= [p valueForKey:@"name"];
NSString *bookName=[p valueForKeyPath:@"book.name"];
//获取对象属性集合
NSMutableArray *array=[p valueForKeyPath:@"books.name"];
//添加监听 options属性发生改变前后的值
[p addObserver:ob forKeyPath:@"name" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:@"传入参数"];
//移除监听
[p removeObserver:ob forKeyPath:@"name"];
而充当属性的监听器,在监听器类的内部实现方法
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)contex
{
NSLog(@"name发生改变,传入的参数是%@,keypath=%@,object=%@,change=%@",contex,keyPath,object,change);
}