KVO和KVC的表面意思很简单,KVO是键值观察者,用来进行事件的监听;KVC则是键值编码,通过对象的Key来来改变对象的属性。但是往底层走一下,这两个方法还是有很多值得研究的地方。
首先我们来研究一下KVO,先创建一个拥有age属性的Person类:
Person *person = [[Person alloc]init];
self.person = person;
person.age = 20;
[person addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:@"KVO是键值观察者"];
person.age = 30;
在上面的代码中,我们设置了person所在的控制器来监听age这个属性。
// 监听属性变化的系统方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{
NSLog(@"%@----%@------%@",context,keyPath,change);
}
当属性person的age属性发生改变时,系统会自动调用上面的方法,其中keyPath代表监听的属性,object代表所监听的对象,change代表所监听属性改变前后的值,context代表传递的信息(id类型)
// 当控制器销毁时,移除观察者
- (void)dealloc{
[self.person removeObserver:self forKeyPath:@"age"];
}
当然最后不要忘了移除监听者,否则系统会报错。
然后我们再来看一下KVC,它会通过属性名来强制改变属性的值,而不用考虑此属性是私有的还是公有的。比如我们同样创建一个Person类,并且这个类有一个私有的属性age,那么我们可以利用以下的操作,访问属性值并修改
Person *person = [[Person alloc]init];
[person setValue:@20 forKey:@"age"];
NSLog(@"%@",[person valueForKey:@"age"]);
网友评论