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"];
-
- //添加监听 <span style="font-family: Arial, Helvetica, sans-serif;">options属性发生改变前后的值</span>
- [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:(voidvoid *)contex
- {
- NSLog(@"name发生改变,传入的参数是%@,keypath=%@,object=%@,change=%@",contex,keyPath,object,change);
-
- }