KVO,即Key-Value Observing机制

Key-Value  Observing提供了一种机制,当指定对象的属性发生变化时,允许对象接受到通知的机制。通俗的说,就是每次指定的被观察对象的属性发生改变时,KVO都会自动的通知相应的观察者。

(1)首先,构思一下实现KVO是否必要。一个对象,当另一个对象的属性发生变化时,需要被通知到 比如PersonObject要观察BankObject的属性accountBalance的变化

(2)PersonObject必须发送一个“addObserver:forKeyPath:options:context:”消息,注册成为BankObject的属性accountBalance的观察者(说 明:“addObserver:forKeyPath:options:context:”方法在指定对象实例之间建立了一个连接。注意,这个连接不是两 个类之间建立的,而是两个对象实例之间建立的。)

(3)为了能够响应消息,观察者必须实现“observeValueForKeyPath:ofObject:change:context:”方法。这个方法实现如何响应消息的变化。在这个方法里面,我们根据自己的实际情况,实现被观察者的属性发生变化时相应的逻辑

4)加入遵循kvo原则的话,当被观察者的属性发生变化时,方法“observeValueForKeyPath:ofObject:change:context:”或自动被调用。

KVO是如何工作的:(1)注册,指定被观察对象的属性,添加观察者

(2)实现回调方法

(3)移除观察者

事例代码:

建立一个Model

#import <Foundation/Foundation.h>

@interface BankObject : NSObject

{

float account;

}

@end

#import "BankObject.h"

@implementation BankObject

@end

#import <UIKit/UIKit.h>

#import "BankObject.h"

@interface ViewController : UIViewController

{

BankObject * bankAccount;

UILabel * _myLabel;

UIButton * _myButton;

}

@end

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

bankAccount = [[BankObject alloc] init];

[bankAccount setValue:@"10" forKey:@"account"];

[bankAccount addObserver:self forKeyPath:@"account" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];

_myLabel = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 200, 100)];

_myLabel.text = [NSString stringWithFormat:@"%@",[bankAccount valueForKey:@"account"]];

_myLabel.textColor = [UIColor whiteColor];

[self.view addSubview:_myLabel];

_myButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];

_myButton.frame = CGRectMake(200, 300, 100, 50);

_myButton.backgroundColor = [UIColor redColor];

[_myButton addTarget:self action:@selector(changeAccount) forControlEvents:UIControlEventTouchUpInside];

[self.view addSubview:_myButton];

}

- (void)changeAccount{

[bankAccount setValue:@"20" forKey:@"account"];

}

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

if ([keyPath isEqualToString:@"account"]) {

_myLabel.text = [NSString stringWithFormat:@"%@",[bankAccount valueForKey:@"account"]];

}

}

这样当我们点击button时,account的值改变,即bankAccount的属性发生了改变,观察者viewController接受到通知,执行observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context方法,label文本发生改变,由10变成20

参考链接:http://www.cnblogs.com/pengyingh/articles/2383629.html

时间: 2024-12-13 14:07:49

KVO,即Key-Value Observing机制的相关文章

Key-Value Observing机制

知识点介绍Key-Value Observing (简写为KVO):当指定的对象的属性被修改了,允许对象接受到通知的机制.每次指定的被观察对象的属性被修改的时候,KVO都会自动的去通知相应的观察者. KVO的优点:当 有属性改变,KVO会提供自动的消息通知.这样的架构有很多好处.首先,开发人员不需要自己去实现这样的方案:每次属性改变了就发送消息通知.这是KVO 机制提供的最大的优点.因为这个方案已经被明确定义,获得框架级支持,可以方便地采用.开发人员不需要添加任何代码,不需要设计自己的观察者模型

KVO(Key Value Observing),是观察者模式在Foundation中的实现。

KVO的原理 简而言之就是: 1.当一个object有观察者时,动态创建这个object的类的子类 2.对于每个被观察的property,重写其set方法 3.在重写的set方法中调用- willChangeValueForKey:和- didChangeValueForKey:通知观察者 4.当一个property没有观察者时,删除重写的方法 5.当没有observer观察任何一个property时,删除动态创建的子类 空说无凭,简单验证下. @interface Sark : NSObjec

iOS开发-由谈KVC、KVO(重点观察者模式)机制编程

一 不小心,小明在<跟着贝尔去冒险>这个真人秀节目中看到了“一日警察,一世警察”的Laughing哥,整个节目除了贝尔吃牛睾丸都不用刀叉的不雅餐饮文 化外,还是镜头少普通话跟小明一样烂的Laughing Sir那种冷静和沉着稳定留下了深刻印象,不由想起电视剧<学警狙击>中为了不暴露钟立文的身份,要求向自己补一枪的警匪卧底巅峰推动者 --Laughing 哥.那么,卧底这样的工作,在我们程序里有没有呢?答案是肯定的,观察者模式. 文章内容思维导图 一.基本概念 1)KVC概念 KVC

redis key的过期机制

redis是一个 高性能的key-value数据库.我们可以对其中的key设置一个过期时间,相关命令如下: 1.在创建一个key value 的时候同时设置过期时间 比如: set key1 value1 EX 60 表示: 我们想要将这个 key value 放到redis中,并在其中保存60秒. set key2 value2 PX 60 表示:我们想要将这个key value放到redis中,并在其中保存 60毫秒 2.对于已经存在的key value, 比如: 事先有 set key3

iOS 错误:… is being deallocated while key value observing are still registered with it

这个错误从字面上来看就是有一个实例由于被observing而无法被释放. 具体原因可能是该对象添加了一个oberver.所以释放的时候要先取消observer. 具体方法是在 dealloc 方法中: - (void)dealloc { [object removeObserver:self forKeyPath:@"aPath"]; } ARC 下不能调用 super 的 dealloc 方法.

KVC&amp;KVO&amp;运行时

运行时:要先了解程序运行的三个阶段 1.编译阶段:clang将OC代码转换成C++,查看运行机制调用的方法 2.链接阶段:与我们使用到得库文件进行链接 3.运行阶段:我们要谈的运行时主要针对这个阶段,运行时机制类似于执行OC的操作系统,是C&C++混编的 KVC:全称 key value coding KVC底层实现原理其实是消息机制+运行时: 1.先去找属性的setter方法,如果有调用 2.再去找属性名,如果有更改 3.再去找字段(成员变量) 如果有赋值 KVO:全称 key value o

iOS开发中KVC、KVO简介

在iOS开发中,KVC和KVO是经常被用到的.可以使用KVC对对象的属性赋值和取得对象的属性值,可以使用KVO监听对象属性值的变化.简单介绍一下KVC和KVO. 一:键值编码(KVC) KVC,全称 Key Value Coding(键值编码),是OC 语言的一个特性,使用KVC,可以对对象的属性进行动态读写. KVC的操作方法由 NSKeyValueCoding协议提供,而NSObject已经实现了这个协议,因此OC中的几乎所有对象都可以使用KVC操作.常用的KVC操作方法有: (1)设置属性

iOS KVO使用方法

KVO(Key Value Observing)其实是一种观察者模式,利用它可以很容易实现视图组件和数据模型的分离,当数据模型的属性值改变之后作为监听器 的视图组件就会被激发,激发时就会回调监听器自身.在ObjC中要实现KVO则必须实现NSKeyValueObServing协议,不过幸运的是 NSObject已经实现了该协议,因此几乎所有的ObjC对象都可以使用KVO. 在ObjC中使用KVO操作常用的方法如下: 注册指定Key路径的监听器: addObserver: forKeyPath: o

对于KVO的一些感受

对于KVO的一些感受 KVO(key value observing )键值监听 使用场景: 当B类的某个属性改变时,改变A类中的属性. 使用方法: 用A来监听B 在A类中引入B类的.h文件定义一个B类的对象b 为b添加监听器 [b addObserver:self forKeyPath:@"b的属性" options:NSKeyValueObservingOptionNew context:nil]; 重写回调监听器的方法 -(void)observeValueForKeyPath: