zoukankan      html  css  js  c++  java
  • iOS----KVC和KVO 详解

    一. KVC

    1.KVC介绍

        KVC 就是键值编码(key-value-coding)。

    2.KVC 的主要作用:

       (1)通过键值路径为对象的属性赋值。主要是可以为私有的属性赋值。

        AppleViewController *appleVC = [[AppleViewController alloc]init];
        [appleVC setValue:@"橘子" forKey:@"name"];
    如果对象A的属性是一个对象B,要设置对象B的属性
        [person setValue:@"旺财" forKeyPath:@"dog.name"];

    (2)通过键值路径获取属性的值。主要是可以通过key获得私有属性的值。

        NSString *nameStr = [appleVC valueForKey:@"name"];

       也可以通过keypath获得值

        NSString *dName = [person valueForKeyPath:@"dog.name"];

    (3)将字典转型成Model,方法:setValuesForKeysWithDictionary:

        // 定义一个字典
        NSDictionary *dict = @{
                               @"name"  : @"jack",
                               @"money" : @"20.7",
                               };
        // 创建模型
        Person *p = [[Person alloc] init];
        
        // 字典转模型
        [p setValuesForKeysWithDictionary:dict];
        NSLog(@"person's name is the %@",p.name);

    注意:字典的key和Model的属性一定要一一对应。否则会出现错误。比如person里没有name的属性,系统报错如下:

    '[<Person 0x60000001d0b0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key name.'

    二. KVO  

    1.KVO介绍:

         KVO 是键值观察者(key-value-observing)。KVO提供了一种观察者的机制,通过对某个对象的某个属性添加观察者,当该属性改变,就会调用"observeValueForKeyPath:"方法,为我们提供一个“对象值改变了!”的时机进行一些操作。

    2.KVO原理

      当某个类的对象第一次被观察时,系统在运行时会创建该类的派生类,改派生类中重写了该对象的setter方法,并且在setter方法中实现了通知的机制。派生类重写了class方法,以“欺骗”外部调用者他就是原先那个类。系统将这个类的isa指针指向新的派生类,因此改对象也就是新的派生类的对象了。因而改对象调用setter就会调用重写的setter,从而激活键值通知机制。此外派生类还重写了delloc方法来释放资源。

    3.KVO的使用

         (1)给对象的属性添加观察者  

        [appleVC addObserver:self forKeyPath:@"name" options: NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];

            注: options: NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld 返回未改变之前的值和改变之后的值    context可以为空

      (2)若该属性发生改变,系统自动调用下面的方法:

    -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
    {
        //拿到新值/旧值,进行操作
        NSLog(@"newValue----%@",change[@"new"]);
        NSLog(@"oldValue----%@",change[@"old"]);
    
    }

      (3)取消监听

    -(void)dealloc
    {
        [person removeObserver:self forKeyPath:@"test"];
    }

    4.KVO的使用场景

    KVO用于监听对象属性的改变。

      (1)下拉刷新、下拉加载监听UIScrollView的contentoffsize;
      (2)webview混排监听contentsize;
      (3)监听模型属性实时更新UI;
      (4)监听控制器frame改变,实现抽屉效果。

     

  • 相关阅读:
    小组互评以及自评
    构建之法的第十、十一、十二章读书笔记
    调研------典型用户及场景
    “吃神么,买神么”的第二个Sprint计划(总结)
    自动化单元测试工具 EvoSuite 的简单使用 【转载】
    2018(秋)软工作业 6:团队项目-软件设计
    2018(秋)软工作业 5:结对项目之词频统计——增强功能
    2018(秋)软工作业 4:结对项目之词频统计——基本功能
    2018(秋)软工作业 3:个人编程练习
    软件工程教学计划(2018-秋季)
  • 原文地址:https://www.cnblogs.com/huadeng/p/7064382.html
Copyright © 2011-2022 走看看