KVO-理解与简单使用

KVO

就是key value observing (键值监听 /观察者模式)/是一种回调机制

观察者模式 :

一个目标对象管理所有依赖于他的观察者对象 /并在它自身的状态改变时主动通知观察者对象 /这个制动通知通常是通过调用各观察者对象所提供的接口方法来实现的 /观察者模式比较完美的将目标对象和观察者对象解耦

简单来说 :

在某个对象注册监听者后/在被监听的对象发生改变时/对象会发送一个通知给监听者/以便监听者执行回调

就是每次指定的被观察的对象的属性被修改后 /KVO就会自动通知响应的观察者

KVO和KVC一样都依赖于Runtime的动态及时 /都属于键值编程而且底层实现机制都是isa-swizzling

KVO运用 : 例-监听scrollView的contentOffset属性/来完成用户滚动时动态改变某些控件的属性实现效果(包括渐变导航栏/下拉刷新控件等效果)

KVO使用 : 要求-对象必须能支持KVC机制(NSobject的子类都支持)/(也就是说 赋值通过setter或者KVC)

方法-注册 指定被观察者的属性 /实现回调方法 /移除观察

适用-很适用模型属性被修改后 / 引发 UIView的变化 /当更改属性的值后 /监听对象会立刻得到通知

当需要检测其他类的属性值变化 /但又不想被观察的类知道

有点像FBI监视嫌疑人 /这个时候就可以使用KVO

苹果文档对KVO的实现描述 :

Automatic key-value observing is implemented using a technique called isa-swizzling... When an observer is registered for an attribute of an object the isa pointer of the observed object is modified, pointing to an intermediate class rather than at the true class ..

也就是说/他使用的技术是ISA调和技术(isa-swizzling) /在我们对某个对象完成监听注册后/编译器会修改所观察到的对象的ISA指针 /可能还会修改了被监听对象的某些属性 /指向一个中间类而不是真正的类 /从某个意义来看 /这是一场骗局

系统实现KVO的步骤:

  • 当类A的对象第一次被观察的时候,系统会在运行期动态创建类A的派生类。我们称为B(NSKVONotifying_A)。
  • 在派生类B(NSKVONotifying_A)中重写类A的setter方法,B类在被重写的setter方法中实现通知机制。
  • 在这个过程中, 被观察对象的isa指针从指向原来A类的, 被KVO机制修改为指向B(NSKVONotifying_A)类, 来实现当前类属性值改变的监听
  • 类B(NSKVONotifying_A)重写会 class方法,将自己伪装成类A。类B还会重写dealloc方法释放资源。
  • 系统将所有指向类A对象的isa指针指向类B的对象。

KVC同KVO一样 /通过isa-swizzling技术实现 /当观察者被注册为 一个对象的属性 的观察对象 的isa指针被修改(就是当观察者被注册为观察对象 谁的观察对象?  一个对象的属性的观察对象 然后 这个属性的ISA指针被修改) /指向一个中间类 /而不是真是的类 /其结果是 isa指针的值并不一定能反应实例的实际类 /所以不能依靠isa指针来确定对象是否是一个类的成员 /应该使用class方法来确定对象实例的类

ISA指针 :

是一个指向Class类指针 /(专业术语是指向元类pointer to the metaclass 用来指向类的类型) /我们可以通过object_getClass方法来获取这个值 /正常来说 class方法内部的实现就是获取这个ISA指针代表的元类(metaclass) /但是在kvo机制中 /苹果注册监听对象后 通过object_allocateClassPair动态重新创建了一个新类和元类 /此时object_getClass()获取的就不是原来ISA指向的元类 /而是新建的元类

ISA指针的作用 :每个对象都有ISA指针 指向该对象的类 /他告诉Runtime系统这个对象的类是什么 /所以对象注册为观察者时 /isa指针指向新类 /那么这个被观察者的对象就神奇的变成新子类的对象(或实例)了 /因而在该对象上对setting的调用就会调用已重写的setter /从而激活键值通知机制

重写setter方法 :

新类重写了setter方法解析 :KVO的键值观察通知依赖于NSObject的两个方法willChangeValueForKey /didChangeValueForKey

被观察属性发生变化之前 willChangeValueForKey被调用 /通知系统keyPath的属性值即将改变

发生改变后 didChangeValueForKey被调用 /通知系统keyPath的属性值已经改变

之后 - addObserver: forKeyPath: options: context 也会被调用

且重写观察属性的setter方法这种继承方式的注入是在运行时而不是编译时实现的


KVO实现步骤


(options通常传- NSkeyValueObservingOptionNew|NSkeyValueObservingOptonOld)

option是KVO里常见的参数

NSkeyValueObservingOption枚举:

NSkeyValueObservingOptionNew:提供更改前的值

NSkeyValueObservingOptionOld:提供更改后的值

NSkeyValueObservingOptionInitial:观察最初的值(在注册观察服务的时候会调用一次触发方法)

NSkeyValueObservingOptionPrior:分别在值修改前后触发方法(即一次修改两次触发 )

注册

(哪个要注册KVO机制 / 观察的属性值 / 给你观察键值变化的选择 /方便传输你需要的数据 )

- addObserver: forKeyPath: options: context

实现(回调)

(观察的属性值/object??? / 存储了一些变化的数据 比如变化前的数据 变化后的数据 如果注册时context不为空 这里就能收到)

- observeValueForKeyPath: ofObject: change: context:

移除

增加观察与取消观察是成对出现的 所以需要在最后的时候 移除观察者(可以在- dealloc方法了写)

- removeObserver: forKeyPath:

时间: 2024-08-06 03:40:14

KVO-理解与简单使用的相关文章

关于数字证书理解的简单整理以及12306网站证书简单分析

首先简单理解一下什么是数字证书.这里是一篇英文文档,描述的很形象.形象的描述了什么是公钥,什么是私钥,如果确保数字证书的可靠性等. 下面,我们看一个应用"数字证书"的实例:https协议.这个协议主要用于网页加密. 一般我们电脑的浏览器中都有一些受信任的证书颁发机构列表, 里边存储的都是一些机构的信息.这些机构都是权威的.当然可以通过安装软件的方式,来增加证书颁发机构,比如中国银行的根证书软件,阿里巴巴的根证书软件.默认我们认为这些软件都是从官网下载的,是绝对的没被篡改的,可靠的.简单

设计模式粗浅理解之一------简单工厂模式

设计模式粗浅理解之------简单工厂模式 什么是简单工厂模式 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现. 角色和职责 工厂(Creator)角色 简单工厂模式的核心,它负责实现创建所有实例的内部逻辑.工厂类可以被外界直接调用,创建所需的产

JS javascript面向对象的理解及简单的示例

javascript面向对象的理解及简单的示例 一. javascript面向对象概念: 为了说明 JavaScript 是一门彻底的面向对象的语言,首先有必要从面向对象的概念着手 , 探讨一下面向对象中的几个概念: 1.一切事物皆对象 2.对象具有封装和继承特性 3.对象与对象之间使用消息通信,各自存在信息隐藏 以这三点做为依据,C++ 是半面向对象半面向过程语言,因为,虽然他实现了类的封装.继承和多态,但存在非对象性质的全局函数和变量.Java.C# 是完全的面向对象语言,它们通过类的形式组

HTML5中的Web Storage(sessionStorage||localStorage)理解与简单实例

Web Storage是什么? Web Storage功能,顾名思义,就是在Web上针对客户端本地储存数据的功能,具体来说Web Storage分为两种: sessionStorage: 将数据保存在session对象中,所谓session是指用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间.session对象可以用来保存在这段时间内所要求保存的任何数据. localStorage: 将数据保存在客户端本地的硬件设备(通常指硬盘,当然可以是其他的硬

Python学习 Day14 python 类和元类(metaclass)的理解和简单运用

python 类和元类(metaclass)的理解和简单运用 (一) python中的类 首先这里讨论的python类,都基于继承于object的新式类进行讨论. 首先在python中,所有东西都是对象.这句话非常重要要理解元类我要重新来理解一下python中的类 class Trick(object): pass 当python在执行带class语句的时候,会初始化一个类对象放在内存里面.例如这里会初始化一个Trick对象 这个对象(类)自身拥有创建对象(通常我们说的实例,但是在python中

KVC 与 KVO 理解-b

KVC 与 KVO 是 Objective C 的关键概念,个人认为必须理解的东西,下面是实例讲解. Key-Value Coding (KVC) KVC,即是指 NSKeyValueCoding,一个非正式的 Protocol,提供一种机制来间接访问对象的属性.KVO 就是基于 KVC 实现的关键技术之一. 一个对象拥有某些属性.比如说,一个 Person 对象有一个 name 和一个 address 属性.以 KVC 说法,Person 对象分别有一个 value 对应他的 name 和 a

python 类和元类(metaclass)的理解和简单运用

(一) python中的类 首先这里讨论的python类,都基于继承于object的新式类进行讨论. 首先在python中,所有东西都是对象.这句话非常重要要理解元类我要重新来理解一下python中的类 class Trick(object): pass 当python在执行带class语句的时候,会初始化一个类对象放在内存里面.例如这里会初始化一个Trick对象 这个对象(类)自身拥有创建对象(通常我们说的实例,但是在python中还是对象)的能力. 为了方便后续理解,我们可以先尝试一下在新式

[转] iOS (OC) 中 KVC 与 KVO 理解

转自: http://magicalboy.com/kvc_and_kvo/ KVC 与 KVO 是 Objective C 的关键概念,个人认为必须理解的东西,下面是实例讲解. Key-Value Coding (KVC) KVC,即是指 NSKeyValueCoding,一个非正式的 Protocol,提供一种机制来间接访问对象的属性.KVO 就是基于 KVC 实现的关键技术之一. 一个对象拥有某些属性.比如说,一个 Person 对象有一个 name 和一个 address 属性.以 KV

iOS 观察者模式(KVO)的简单使用

KVO的全称是Key-Value Observing,它实现了一种机制,对所关心的属性对象添加观察者,当属性值发生变化时会得到通知,我们可以对变化做相应的处理.看过设计模式的同学应该知道,这是一种典型的观察者模式.KVO的最大优点就是底层框架已经支持,开发人员不需要实现属性值发生变化时发送通知的方案,这样就大大减少开发的工作量.其次,KVO框架很强大,可以支持多个观察者观察同一属性,或者一个观察者监听不同属性. KVO的使用比较简单,基本上都是三步: 1.注册观察者 addObserver:fo

KVC 与 KVO 理解

KVC 与 KVO 是 Objective C 的关键概念,个人认为必须理解的东西,下面是实例讲解. Key-Value Coding (KVC) KVC,即是指 NSKeyValueCoding,一个非正式的 Protocol,提供一种机制来间接访问对象的属性.KVO 就是基于 KVC 实现的关键技术之一. 一个对象拥有某些属性.比如说,一个 Person 对象有一个 name 和一个 address 属性.以 KVC 说法,Person 对象分别有一个 value 对应他的 name 和 a