zoukankan      html  css  js  c++  java
  • iOS KVC 和 KVO 的学习

    KVC  (NSKey Value Coding) :键值编码 

    KVO (Key Value Observing) :键值监听

    前言:我曾经用过 监听 一个音频何时结束 监听视频播放 状态等 用了这种方法 今天特地总结一下KVC 和 KVO.以方便以后深入学习与运用. 再而有了全新认识,再做更专业的总结. 

    KVC :  一个非正式的Protocol,提供一种机制来间接访问对象的属性。而不是通过调用Setter、Getter方法访问。

    简单的说,KVC 可以不进行任何操作 就可以进行对象属性的动态读写.

    KVC的操作方法由NSKeyValueCoding协议提供,而NSObject就实现了这个协议(KVC),也就是说ObjC中几乎所有的对象都支持KVC操作,常用的KVC操作方法如下:

    · 动态设置: setValue:属性值 forKey:属性名(用于简单路径)、setValue:属性值 forKeyPath:属性路径用于复合路径,例如Person有一个Account类型的属性,那么person.account就是一个复合属性) 

    · 动态读取: valueForKey:属性名 、valueForKeyPath:属性名(用于复合路径)

    注意:

    (1). key的值必须正确,如果拼写错误,会出现异常

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

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

    (4). NSArray/NSSet等都支持KVC

    KVO :就是基于 KVC 实现的关键技术之一。这是一个典型的观察者模式,观察者在键值改变时会得到通知.

    KVO的使用也很简单,就是简单的3步。

          1.注册需要观察的对象的属性addObserver:forKeyPath:options:context:

          2.实现observeValueForKeyPath:ofObject:change:context:方法,这个方法当观察的属性变化时会自动调用

          3.取消注册观察removeObserver:forKeyPath:context: //在dealloc中移除观察者

    注册方法的参数: 

      object : 被观察对象

      observer: 观察对象

      forKeyPath里面带上property的name,如UIView的frame、center等等

      options: 有4个值,分别是:

      NSKeyValueObservingOptionNew 把更改之前的值提供给处理方法

      NSKeyValueObservingOptionOld 把更改之后的值提供给处理方法

      NSKeyValueObservingOptionInitial 把初始化的值提供给处理方法,一旦注册,立马就会调用一次。通常它会带有新值,而不会带有旧值。

      NSKeyValueObservingOptionPrior 分2次调用。在值改变之前和值改变之后。

        注:例子里的0就代表不带任何参数进去

      context: 可以带入一些参数,其实这个挺好用的,任何类型都可以,自己强转就好了。

    实现方法的参数:

      keyPath: 对应forKeyPath

      object:  被观察的对象

      change:  对应options里的NSKeyValueObservingOptionNew、NSKeyValueObservingOptionOld

      context: 对应context

      注意:

       (1) 需要强调的是KVO的回调要被调用,属性必须是通过KVC的方法来修改的,如果是调用类的其他方法来修改属性,这个观察者是不会得到通知的。 

       (2)KVO实现原理:kvo实现通知对象的具体原理是什么呢?其实这是通过Objective-C强大的runtime运行时机制实现的。当你第一次观察某个对象时,runtime会创建一个新的继承被监听类的子类。在这个新的类中,它会重写所有被观察的key,然后将对象的isa指针指向新创建的类(oc语言中,每一个类实际上也是一个对象。每一个类也有一个isa指针)。所以对象神奇的变成了新的子类的实例。这些被重写的方法中添加了调用通知观察者的方法的代码。当一个对象的一个属性改变时,会触发setKey方法,但这个方法被重写了,并且在内部添加了发送通知机制

    KVO和NSNotification的区别:

    和delegate一样,KVO和NSNotification的作用也是类与类之间的通信,与delegate不同的是

    1)这两个都是负责发出通知,剩下的事情就不管了,所以没有返回值;

    2)delegate只是一对一,而这两个可以一对多。这两者也有各自的特点。

    3)不同于KVO,NSNotification不依赖于键值监听

    参考:

    http://www.mamicode.com/info-detail-515516.html

    http://www.cnblogs.com/kenshincui/p/3871178.html

  • 相关阅读:
    .NET技术对软件行业的积极作用
    ADO.NET Entityframework MYSQL provider
    用杯子量水问题通用解法
    详解.NET异步
    说 框架、架构、模式、重构
    谈 三层结构与MVC模式的区别
    面试题一例分享
    LINQ notes2 lambda expression
    毕业论文B.3 DTW算法
    LINQ notes1 intro
  • 原文地址:https://www.cnblogs.com/someonelikeyou/p/5584010.html
Copyright © 2011-2022 走看看