Key-Value Coding(KVC)
KVC,是指 NSKeyValueCoding,NSObject 的分类, NSObject(NSKeyValueCoding) ,提供一种机制来间接访问对象的属性和值。KVO是基于KVC实现的关键技术之一。
例如:一个Person对象有一个name和一个age属性,一个book对象,
Person *p = [[Person alloc] init];
p.name = @"Jack";
p.age = 10;
Book *book=[[Book alloc] init];
book.name=@"倾城之恋";
p.book=book;
NSString *presonName=[p valueForKeyPath:@"name"];
NSLog(@"presonName-----%@",presonName);
打印如下:
presonName-----Jack
NSString *bookName=[[p valueForKey:@"book"] valueForKey:@"name"];等价于
NSString *presonName=[p valueForKeyPath:@"book.name"];
NSLog(@"bookName-----%@",bookName);
打印如下:
bookName-----倾城之恋
注意:key和key path的区别,key可以从一个对象获取值,而 key path 可以将多个key用点号“.”分开
Key-Value Observing (KVO)
Key-Value Observing (KVO)建立在kvc之上,它能够观察一个对象key path值得改变
例如:
- (void)viewDidLoad
{
[super viewDidLoad];
HMPerson *p = [[HMPerson alloc] init];
p.age = 20;
//实现观察
[p addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil];
//改变值
p.age = 30;
self.p = p;
}
//停止观察
- (void)dealloc
{
[self.p removeObserver:self forKeyPath:@"age"];
}
/**
* 当监控的某个属性的值改变了就会调用
*
* @param keyPath 属性名(哪个属性改了?)
* @param object 哪个对象的属性被改了?
* @param change 属性的修改情况(属性原来的值、属性最新的值)
* @param context void * == id
*/
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
NSLog(@"%@对象的%@属性改变了:%@", object, keyPath, change);
}
打印如下:
<HMPerson: 0x7fac02ce0d20>对象的age属性改变了:{
kind = 1;
new = 30;
old = 20;
}