/**
* KVC基本概念
*
* KVC全称Key-value coding(键值编码)
* 一个非正式的Protocol,提供一种机制来间接访问对象的属性
*/
/**
* KVC的作用
*
* KVC是可以直接通过路径(字符串)获取对应的键的值
* 访问私有变量(一个类中的私有变量,不能直接通过Setter、Getter方法访问。但是却可以通过KVC来访问)
* 使用KVC直接访问 NSArray 或者 NSSet 的属性值
* 使用KVC将字典(json)转化成模型
*/
/**
* KVC注意点
*
* key的值必须正确,如果拼写错误,会出现异常
* 当key的值是没有定义的,valueForUndefinedKey:这个方法会被调用,如果你自己写了这个方法,key的值出错就会调用到这里来
* 因为类key反复嵌套,所以有个keyPath的概念,keyPath就是用.号来把一个一个key链接起来,这样就可以根据这个路径访问下去
* NSArray/NSSet等都支持KVC
*/
//使用KVC直接访问 NSArray 或者 NSSet 的属性值
UILabel * label1 = [[UILabel alloc]init];
label1.text = @"label1";
UILabel * label2 = [[UILabel alloc]init];
label2.text = @"label2";
UILabel * label3 = [[UILabel alloc]init];
label3.text = @"label3";
NSArray * labelArr = @[label1,label2,label3];
NSArray * labelTextArr = [labelArr valueForKey:@"text"];
NSLog(@"labelTextArr = %@",labelTextArr);
/**
* KVO基本概念
*
* KVO全称Key-Value Observing(键值观察)
* 典型的观察者模式承载者
* 基于监控键值发生变化,通知观察者
* KVO 就是基于 KVC 实现的关键技术之一
*/
/**
* KVO的作用
*
* KVO可以监视键值变化,并通知观察者
*/
/**KVO使用注意点
*
* KVO使用后需要手动释放
* kvo监听的是对象指针的变动(NSString、int、float等对象的变动(abc = @"123"、abc = 12、abc = 12.2)皆为指针的变动),因此KVO是不能直接监听控制器ViewController数组的变化的,要监听数组的变化就要改变数组的指针(重新alloc)
*/
/**
* 添加KVO监听者
*
* @param observer 观察者(监听器)
* @param keyPath 属性名(要观察的属性)
* @param options
* @param context 传递的参数
*/
[self.backView addObserver:self forKeyPath:@"backgroundColor" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:@"color"];
/**
* 当利用KVO监听到某个对象的属性值发生了改变,就会自动调用这个
*
* @param keyPath 哪个属性被改了
* @param object 哪个对象的属性被改了
* @param change 改成咋样
* @param context 当初addObserver时的context参数值
*/
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
if ([keyPath isEqualToString:@"backgroundColor"]) {
NSLog(@"%@",change);
NSLog(@"%@",context);
self.state.text = [NSString stringWithFormat:@"%@",change[@"new"]];
}
}
//释放KVO监听
-(void)dealloc
{
[self.backView removeObserver:self forKeyPath:@"backgroundColor"];
}