KVC、 KVO
一、KVC
1.KVC(Key-Value-Coding):键值编码。
1)是一种存取值的方式。通过key存value 或者通过key获取value。
2)key从哪里来?
key把对象里面的属性名、变量名当做了一个key(把属性名、变量名看成了一个普普通通的字符串来使用)。
把name当成一个key来使用
@property (nonatomic, copy) NSString *name;
3)以字符串的形式向对象发送消息,字符串是存取值的关键。
4)在给对象存取值的时候,可以选择使用KVC。
5)键-值编码方法在Objective-C非正式协议(类目)NSKeyValueCoding中被声明,默认的实现方法由NSObject提供。
2.如何使用KVC?
1)通过setValue:forKey:和setValue:forKeyPath:存值。
2)通过valueForKey:和valueForKeyPath:取值。
//———————————————通过键存取值——————-------———————//
Person *person = [[Person alloc]init];//(在person里面得有这个“myFather”键)
[person setValue:@"李刚" forKey:@"myFather"];//通过键 存值过程
NSString *fatherName = [person valueForKey:@"myFather"];//通过键 取值过程
//——————————————通过键路径存取值——————-----———————//
用“.”来表示 它是一个键路径。
[huLuWa setValue:@"旺财" forKeyPath:@“dog.name"]
二、KVO
1.KVO(Key-Value-Observer):键值观察者。
1)通过key来观察value的变化,去做出响应。
2)作用?
KVO(键值观察者)主要用于视图交互方面。比如界面的某些数据变化了,界面显示也跟着需要变化,那就要建立数据和界面的关联。
注意:KVO是一对一的传值。
2.如何使用KVO?
通过key来监测值是否发生改变,如果发生改变,就会自动调用KVO的响应方法。
1)被观察者发出 addObserver:forKeyPath:options:context: 方法来添加观察者。
2)只要被观察者的keyPath值变化(通过键值),就会在观察者里调用方法observeValueForKeyPath:ofObject:change:context:
3)观察者需要实现方法 observeValueForKeyPath:ofObject:change:context: 来对KVO发出的通知做出响应(change 是一个字典 字典里面放了 新旧属性值的内容)。
4)这些代码都只需在观察者里进行实现,被观察者不用添加任何代码,所以谁要监听谁注册,运用很灵活很 简便;但是KVO只能检测类中的属性,并且属性名都是通过NSString来查找
5)如果不使用观察者一定要移除观察者,在dealloc中,通过以下方法:
[对象名 removeObserver:self forKeyPath:@"被观察者的键" context:nil];
代码实现如下:
//观察者里面的代码
- (id)initWithPerson:(Person *)newPerson
{
self = [super init];
if (self) {
person = newPerson;
// [person addObserver:self forKeyPath:@"arms" options:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew context:nil];//添加观察者
}
return self;
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context//当观察者发现keyPath里面的键值被改变时 会调用这个方法
{
if ([keyPath isEqualToString:@"arms"]) {
NSLog(@"\n新的:%@\n旧的:%@",change[@"new"],change[@"old"]);
}
}
- (void)dealloc
{
//要注意 不用了 一定要移除观察者
[person removeObserver:self forKeyPath:@"arms" context:nil];//移除观察者}