KVC、 KVO

KVC、 KVO                                                         

一、KVC

1.KVC(Key-Value-Coding):键值编码。

   1)是一种存取值的方式。通过key存value 或者通过key获取value。

    2)key从哪里来?

          key把对象里面的属性名、变量名当做了一个key(把属性名、变量名看成了一个普普通通的字符串来使用)。

          把name当成一个key来使用

         @property (nonatomic, copy) NSString *name;

     3)以字符串的形式向对象发送消息,字符串是存取值的关键。

      4)在给对象存取值的时候,可以选择使用KVC。

       5)键-值编码方法在Objective-C非正式协议(类目)NSKeyValueCoding中被声明,默认的实现方法由NSObject提供。

2.如何使用KVC?

  1)通过setValue:forKey:和setValue:forKeyPath:存值。

  2)通过valueForKey:和valueForKeyPath:取值。

 //———————————————通过键存取值——————-------———————//

        Person *person = [[Person alloc]init];//(在person里面得有这个“myFather”键)

        [person setValue:@"李刚" forKey:@"myFather"];//通过键 存值过程

        NSString *fatherName = [person valueForKey:@"myFather"];//通过键 取值过程

 //——————————————通过键路径存取值——————-----———————//

        用“.”来表示 它是一个键路径。

        [huLuWa setValue:@"旺财" forKeyPath:@“dog.name"]


二、KVO

1.KVO(Key-Value-Observer):键值观察者。

      1)通过key来观察value的变化,去做出响应。

      2)作用?

            KVO(键值观察者)主要用于视图交互方面。比如界面的某些数据变化了,界面显示也跟着需要变化,那就要建立数据和界面的关联。

注意:KVO是一对一的传值。

2.如何使用KVO?

        通过key来监测值是否发生改变,如果发生改变,就会自动调用KVO的响应方法。

1)被观察者发出  addObserver:forKeyPath:options:context:  方法来添加观察者。

 2)只要被观察者的keyPath值变化(通过键值),就会在观察者里调用方法observeValueForKeyPath:ofObject:change:context:

  3)观察者需要实现方法 observeValueForKeyPath:ofObject:change:context: 来对KVO发出的通知做出响应(change 是一个字典 字典里面放了 新旧属性值的内容)。

 4)这些代码都只需在观察者里进行实现,被观察者不用添加任何代码,所以谁要监听谁注册,运用很灵活很 简便;但是KVO只能检测类中的属性,并且属性名都是通过NSString来查找

5)如果不使用观察者一定要移除观察者,在dealloc中,通过以下方法:

  [对象名 removeObserver:self forKeyPath:@"被观察者的键" context:nil];


代码实现如下:









//观察者里面的代码

- (id)initWithPerson:(Person *)newPerson

{

    self = [super init];

    if (self) {

        person = newPerson;

        //        [person addObserver:self forKeyPath:@"arms" options:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew context:nil];//添加观察者  

    }

    return self;

}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context//当观察者发现keyPath里面的键值被改变时  会调用这个方法

{

       if ([keyPath isEqualToString:@"arms"]) {

         NSLog(@"\n新的:%@\n旧的:%@",change[@"new"],change[@"old"]);

       }

}

- (void)dealloc

{

    //要注意  不用了 一定要移除观察者

    [person removeObserver:self forKeyPath:@"arms" context:nil];//移除观察者}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值