你真的了解KVO和KVC吗

      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 *)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"]);

你可能感兴趣的:(你真的了解KVO和KVC吗)