1.KVC(键值编码)是一种间接访问对象实例变量的机制,该机制可以不通过存取方法就可以访问对象的实例变量
2.KVO(键值观察)是一种能使的对象获取到其他对象属性的通知机制。
3.实现KVO键值观察模式,被观察的对象必须使用KVC键值编码来修改它的实例变量,这样才能被观察者观察到。因此,KVC是KVO的基础或者说KVO的实现是建立在KVC的基础之上的
KVO的键值观察:
- (void)testKvo
{
HMPerson *p = [[HMPerson alloc] init];
p.age = 20;
//forKeyPath 被观察的属性 options 显示 被观察者属性改变后的 新值(NSKeyValueObservingOptionNew) 还是 旧值(NSKeyValueObservingOptionOld)
[p addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil];
p.age = 30;
p.age = 40;
self.p = p;
}
//p.age被释放是解除对该属性的观察
- (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);
}
KVC的键值编码:
- (void)testKvc
{
// key value coding : 间接通过字符串类型的key取出对应的属性值
// KVC的价值
// 1.可以访问私有成员变量的值
// 2.可以间接修改私有成员变量的值(替换系统自带的导航栏、tabbar)
HMPerson *p = [[HMPerson alloc] init];
// p.age = 20;
// NSLog(@"年龄=%d", p.age);
// NSLog(@"年龄=%d", [p age]);
// int age = [[p valueForKey:@"age"] intValue];
// NSLog(@"年龄=%d", age);
// NSLog(@"%f", [[p valueForKey:@"height"] floatValue]);
// float h1 = [[p valueForKey:@"height"] floatValue];
// float h2 = [[p valueForKeyPath:@"height"] floatValue];
// NSLog(@"%f %f", h1, h2);
// p.dog = [[HMDog alloc] init];
// p.dog.name = @"wangcai";
// NSLog(@"%@", [p valueForKeyPath:@"dog.name"]);
// keyPath包含了key的功能
// key:只能访问当前对象的属性
// keyPath:能利用.运算符一层一层往内部访问属性
HMBook *b1 = [[HMBook alloc] init];
b1.name = @"kuihua";
b1.price = 100.6;
HMBook *b2 = [[HMBook alloc] init];
b2.name = @"pixie";
b2.price = 5.6;
HMBook *b3 = [[HMBook alloc] init];
b3.name = @"jiuyin";
b3.price = 50.6;
p.books = @[b1, b2, b3];
// NSLog(@"%@", [p valueForKeyPath:@"books.@count"]); // 计算数组的长度(KVC的一些符号方法@sum,@count等)
// NSArray *names = [p valueForKeyPath:@"books.name"];
// NSArray *names = [p.books valueForKeyPath:@"name"];
// NSLog(@"%@", names);
double sumPrice = [[p valueForKeyPath:@"books.@sum.price"] doubleValue];
NSLog(@"%f", sumPrice);
}
简单总结就是这些,希望能对初学者有一些帮助;欢迎交流!