首页 > 代码库 > KVO 与 KVC 区别

KVO 与 KVC 区别

还长时间 没来了  今天分享一下 个人总结的 KCO  KVC 笔记:

(如有错误,请速速联系我  愿听你的建议!)

KVO 与 KVC 区别:
 
  • KVO 主要用于监听属性属性改变 
  • KVC 主要用于对某一对象的成员变量赋值
 
 KVO:   
运用KVO 监听成员属性 时   想要监听哪个 就对哪个属性监听
    // KVO 监听属性改变

    [item addObserver:self forKeyPath:@"one" options:0 context:nil];

    [item addObserver:self forKeyPath:@"Two" options:0 context:nil];

    [item addObserver:self forKeyPath:@"Three" options:0 context:nil];

    [item addObserver:self forKeyPath:@"Four" options:0 context:nil];

    

 

 
 

既然监听了 就必须实现系统的监听方法: (在这个方法中设置一些属性值)
/**
 *  
监听到某个对象的属性改变了,就会调用
 *
 *  
@param keyPath 属性名
 *  
@param object  哪个对象的属性被改变
 *  
@param change  属性发生的改变
 */

     - (
void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

 
 既然对 属性进行监听  那就要在对象销毁时 对其中的属性移除监听 比如:
          - (void)dealloc
      {
         [
self.item removeObserver:self forKeyPath:@"badgeValue"];
         [
self.item removeObserver:self forKeyPath:@"title];
      }
 
 

KVC:

    我们一般是通过调用set方法或属性的点语法来直接更改对象的状态,即对象的属性值,比如[stu setAge:10];  stu.age = 9;
    KVC,它是一种间接更改对象状态的方式,其实现方法是使用字符串来描述对象需要更改的属性。KVC中的基本调用包括valueForKey:setValue:ForKey:,以 字符串的形式向对象发送消息
   这里以Student和Card为例子

 

     1.使用setValue:ForKey:设置Student对象的name

[student setValue:@"one" forKey:@"name"];

     使用setValue:ForKey:设置Student对象的age

[student setValue:[NSNumber numberWithInt:17] forKey:@"age"];

 在设置一个标量值时,需要先将标量值包装成一个NSNumberNSValue对象

 

       2.KVC可以对对象进行批量更改
         例如,同时获取Student的age和name

NSArray *keys = [NSArray arrayWithObjects:@"name", @"age", nil];

NSDictionary *dict = [student dictionaryWithValuesForKeys:keys];

 

    3.  同时设置Student的age和name

NSArray *keys = [NSArray arrayWithObjects:@"name", @"age", nil];

NSArray *values = [NSArray arrayWithObjects:@"One", [NSNumber numberWithInt:16], nil];

NSDictionary *dict = [NSDictionary dictionaryWithObjects:values forKeys:keys];

[student setValuesForKeysWithDictionary:dict];