您的位置:首页 > 移动开发 > IOS开发

【iOS Tips】005-什么是KVO、KVC?

2018-07-26 15:46 846 查看
1.KVC-Key Value Coding-键值编码

KVC是cocoa的一个标准组成部分,它能让我们可以通过Key的方式访问属性, 不必调用明确的property accssor。

KVC几个使用场景:

1、通过Key/KeyPath获取值。

ViewController *vc = [[ViewController alloc]init];
[vc valueForKey:@"name"];
[vc valueForKeyPath:@"name.lowercaseString"];

valueForKey只能获取键对应的值。而valueForKeyPath还可以传递关系。如上代码所示我们可以通过name.lowercaseString直接获取到name小写字符串。

又比如vc中有一个people对象,people对象有一个age属性。我们可以直接通过以下代码访问age属性:

[vc valueForKeyPath:@"people.age"]

2、通过Key/KeyPath设置值:

[vc setValue:@"xiaoming" forKey:@"name"];
[vc setValue:[People new] forKeyPath:@"people"];
[vc setValue:@"@16" forKeyPath:@"people.age"];

3、通过字典映射设置模型的值:

NSDictionary *dict = @{@"age":@18};
People *people = [[People alloc]init];
[people setValuesForKeysWithDictionary:dict];

不过使用时需要注意,当属性中没有对应的key时,系统会抛出异常。这时我们需要在该类中实现以下方法:

#import "People.h"

@implementation People

- (void)setValue:(id)value forUndefinedKey:(NSString *)key{
//处理未定义的key
}

@end


2.KVO-Key-Value-Observing-键值观察者。

KVO提供了一种观察者的机制,通过对某个对象的某个属性添加观察者,当该属性改变,就会调用"observeValueForKeyPath:"方法,告诉我们这个属性变化了。

a.给对象的属性添加观察者

//KVC
[_people addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionNew context:nil];

b.监听属性

- (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.移除观察者

[_people removeObserver:self forKeyPath:@"age"];
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: