你真的了解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<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"]);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容