zoukankan      html  css  js  c++  java
  • OC-设计模式KVC+KVO定义及使用

    一.KVC

    Key-Value-Coding 键值编码(KVC:是一种存取值的方式,通过key存value 或者通过key获取value

     key从哪里来的呢?

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

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

    例子:

    在person类中声明了一个name属性,并初始化一个对象sushi。

    存值:,,,,,,,setValue:,,,,,,,forKey:,,,,,,,,

    [sushi setValue :@"苏轼"forKey:@"shshi"];

    取值:,,,,,,,valueForKey:,,,,,,,

    NSString *str = [sushi valueForKey :@"sushi"];

    路径存取值,用“ . ”来表示 它是一个键路径(不是属性的那种哦!!)

    //通过路径查找人家里狗身上的跳蚤,在Person类里声明一个狗的类型dog,在狗的类里声明一个跳蚤类型的tiao。在跳蚤类里声明一个name的属性。初始化狗gg,跳蚤tt。

    首先要他们联系起来,相互知道:

    [sushi setValue:gg forKey:@"dog"];

    [gg setValue:tt forKey:@"tiao"];

    存值:setValue:,,,,,,,,forKeyPath:,,,,,,,,

    [sushi setValue:@"跳蚤"forKeyPath:@"dog.tiao.name"] ;

    取值:valueForKeyPath:,,,,,,,,

    NSString *name = [sushi valueForKeyPath:@"dog.tiao.name"];

     

    二.KVO

     

                                       Key-Value-Observer 键值观察者

     通过Key来观察Value的变化 去做出响应

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

            

        KVO是一对一的传值

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

     

     

    Key-Value-Observer 键值观察者 

      是一对一传值

    通过key来检测值是否发生改变 如果发生改变 就会调用kvo的响应方法。

    如果使用完观察者 就需要移除观察者,防止再次使用通知 接收不到消息

     

    例子:让一个人观察一个狗的表情变化。

    首先在狗中定义一个属性 face;

    在观察者 中定义一个方法 通过key来检测值是否发生改变

    -(void)watch:(Dog *)dog{

     

    _dog = dog;//这里是为了后面移除观察者

     

    [_dog addObserver:self forKeyPath: @“face”   options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil ];

     

    {

    当检测的值发生改变的时候,自动调用下面这个方法:

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

    {

    //然后判断开始做出你想要的反应

    if(keyPath isEqualToString :@"face")

    {

    NSLog(@"狗的表情由%@变成了%@",change[@"old"],change[@"new"]);

    [self eat]//做出自己想要的反应

     

    }

     

    }

     

    -(void)eat{

        NSLog(@"丢一块肉");

    }

     

    //移除观察者

    -(void)dealloc{

        [_dog   removeObserver:self forKeyPath:@"face"];

     

    在主文件中

    Dog *moyangquan = [Dog new];

            moyangquan.face = @“smile";

     

            Person *liBai = [Person new];

            [liBai watchDog:moyangquan];

    //狗的发生改变

    moyangquan.face = @“wangwang";

     

    结果: 

            

     

  • 相关阅读:
    大道至简读后感
    CodeWarrior10 如何复制Workspace配置到另一个workspace
    CCS 6新建文件自动生成注释
    C语言之标准头文件模板
    C语言之标准源文件模板
    正确理解c和c ++的复杂类型声明
    各种滤波算法的介绍及其实现
    函数的前部注释
    关于C语言头文件写法的探讨
    02_温湿度传感器
  • 原文地址:https://www.cnblogs.com/chenhongios/p/4609894.html
Copyright © 2011-2022 走看看