Home 005-什么是KVO、KVC?
Post
Cancel

005-什么是KVO、KVC?

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"];
This post is licensed under CC BY 4.0 by the author.

007-protected-private-public-package

008-序列化与反序列化