首页 > 代码库 > kvc和kvo

kvc和kvo

 /**

     * KVC基本概念

     *

     * KVC全称Key-value coding(键值编码)

     * 一个非正式的Protocol,提供一种机制来间接访问对象的属性

     */

    /**

     * KVC的作用

     *

     * KVC是可以直接通过路径(字符串)获取对应的键的值

     * 访问私有变量(一个类中的私有变量,不能直接通过Setter、Getter方法访问。但是却可以通过KVC来访问)

     * 使用KVC直接访问 NSArray 或者 NSSet 的属性值

     * 使用KVC将字典(json)转化成模型

     */

    

    /**

     * KVC注意点

     *

     * key的值必须正确,如果拼写错误,会出现异常

    

     * 当key的值是没有定义的,valueForUndefinedKey:这个方法会被调用,如果你自己写了这个方法,key的值出错就会调用到这里来

     * 因为类key反复嵌套,所以有个keyPath的概念,keyPath就是用.号来把一个一个key链接起来,这样就可以根据这个路径访问下去

     * NSArray/NSSet等都支持KVC

     */

    

 //使用KVC直接访问 NSArray 或者 NSSet 的属性值

    UILabel * label1 = [[UILabel alloc]init];

    label1.text = @"label1";

    UILabel * label2 = [[UILabel alloc]init];

    label2.text = @"label2";

    UILabel * label3 = [[UILabel alloc]init];

    label3.text = @"label3";

    NSArray * labelArr = @[label1,label2,label3];

    NSArray * labelTextArr = [labelArr valueForKey:@"text"];

    NSLog(@"labelTextArr = %@",labelTextArr);

    

    /**

     * KVO基本概念

     *

     * KVO全称Key-Value Observing(键值观察)

     * 典型的观察者模式承载者

     * 基于监控键值发生变化,通知观察者

     * KVO 就是基于 KVC 实现的关键技术之一

     */

 

    /**

     * KVO的作用

     *

     * KVO可以监视键值变化,并通知观察者

     */

  /**KVO使用注意点

   *

   * KVO使用后需要手动释放   

   * kvo监听的是对象指针的变动,因此KVO是不能直接监听控制器ViewController数组的变化的,要监听数组的变化就要改变数组的指针(重新alloc)

   */

    /**

     *  添加KVO监听者

     *

     *  @param observer 观察者(监听器)

     *  @param keyPath  属性名(要观察的属性)

     *  @param options

     *  @param context  传递的参数

     */

    [self.backView addObserver:self forKeyPath:@"backgroundColor" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:@"color"];

   

/**

 *  当利用KVO监听到某个对象的属性值发生了改变,就会自动调用这个

 *

 *  @param keyPath 哪个属性被改了

 *  @param object  哪个对象的属性被改了

 *  @param change  改成咋样

 *  @param context 当初addObserver时的context参数值

 */

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{

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

        NSLog(@"%@",change);

        NSLog(@"%@",context);

        self.state.text = [NSString stringWithFormat:@"%@",change[@"new"]];

    }

}

//释放KVO监听

-(void)dealloc

{

    [self.backView removeObserver:self forKeyPath:@"backgroundColor"];

}

 

kvc和kvo