博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
kvc和kvo
阅读量:5129 次
发布时间:2019-06-13

本文共 2067 字,大约阅读时间需要 6 分钟。

 /**

     * 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监听的是对象指针的变动(NSString、int、float等对象的变动(abc = @"123"、abc = 12、abc = 12.2)皆为指针的变动),因此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"];

}

 

转载于:https://www.cnblogs.com/670074760-zsx/p/6708500.html

你可能感兴趣的文章
【Java】synchronized与lock的区别
查看>>
django高级应用(分页功能)
查看>>
【转】Linux之printf命令
查看>>
关于PHP会话:session和cookie
查看>>
STM32F10x_RTC秒中断
查看>>
display:none和visiblity:hidden区别
查看>>
C#double转化成字符串 保留小数位数, 不以科学计数法的形式出现。
查看>>
牛的障碍Cow Steeplechase
查看>>
Zookeeper选举算法原理
查看>>
3月29日AM
查看>>
利用IP地址查询接口来查询IP归属地
查看>>
HTML元素定义 ID,Class,Style的优先级
查看>>
构造者模式
查看>>
http和https的区别
查看>>
Hbuild在线云ios打包失败,提示BuildConfigure Failed 31013 App Store 图标 未找到 解决方法...
查看>>
找到树中指定id的所有父节点
查看>>
今天新开通了博客
查看>>
AS3优化性能笔记二
查看>>
ElasticSearch(站内搜索)
查看>>
4----COM:a Generative Model for group recommendation(组推荐的一种生成模型)
查看>>