1.KVC-Key Value Coding-键值编码
KVC是cocoa的一个标准组成部分,它能让我们可以通过Key的方式访问属性, 不必调用明确的property accssor。
KVC几个使用场景:
1、通过Key/KeyPath获取值。
1
2
3
ViewController *vc = [[ViewController alloc]init];
[vc valueForKey:@"name"];
[vc valueForKeyPath:@"name.lowercaseString"];
valueForKey只能获取键对应的值。而valueForKeyPath还可以传递关系。如上代码所示我们可以通过name.lowercaseString直接获取到name小写字符串。
又比如vc中有一个people对象,people对象有一个age属性。我们可以直接通过以下代码访问age属性:
1
2
[vc valueForKeyPath:@"people.age"]
2、通过Key/KeyPath设置值:
1
2
3
[vc setValue:@"xiaoming" forKey:@"name"];
[vc setValue:[People new] forKeyPath:@"people"];
[vc setValue:@"@16" forKeyPath:@"people.age"];
3、通过字典映射设置模型的值:
1
2
3
NSDictionary *dict = @{@"age":@18};
People *people = [[People alloc]init];
[people setValuesForKeysWithDictionary:dict];
不过使用时需要注意,当属性中没有对应的key时,系统会抛出异常。这时我们需要在该类中实现以下方法:
1
2
3
4
5
6
7
8
9
10
#import "People.h"
@implementation People
- (void)setValue:(id)value forUndefinedKey:(NSString *)key{
//处理未定义的key
}
@end
2.KVO-Key-Value-Observing-键值观察者。
KVO提供了一种观察者的机制,通过对某个对象的某个属性添加观察者,当该属性改变,就会调用”observeValueForKeyPath:”方法,告诉我们这个属性变化了。
a.给对象的属性添加观察者
1
2
//KVC
[_people addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionNew context:nil];
b.监听属性
1
2
3
4
5
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
if ([keyPath isEqualToString:@"age"]) {
NSLog(@"object %@ 的 age 变为 %@",object,_people.age);
}
}
c.移除观察者
1
[_people removeObserver:self forKeyPath:@"age"];