什么是KVO?

KVO(Key-Value Observing)键值观察,是一种通过对对象的某一个属性添加观察者,一旦这个属性值发生变化,就会通知当前观察者的一种机制。

该如何使用?

1.注册,指定被观察者的属性

 [object addObserver:self forKeyPath:key options:NSKeyValueObservingOptionNew context:nil];

参数说明:

object:被观察的对象

observer:观察者对象

keyPath:被观察对象的属性名称

NSKeyValueObservingOptions:有4个值

NSKeyValueObservingOptionNew 监听它的新值

NSKeyValueObservingOptionOld  监听它的旧值

NSKeyValueObservingOptionInitial 监听初始化

NSKeyValueObservingOptionPrior 分2次调用。监听旧值和新值

context: 可以带入一些参数,任何类型都可以,强制转就可以。

2.实现回调函数

-(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
NSLog(@"keyPath---->%@ change--->%@",keyPath,change);
}

参数说明:

keyPath:被观察对象的属性名称

object:被观察的对象

change:新值或者旧值

context:对应的context

3. 移除观察

 [object removeObserver:self forKeyPath:@"name"];

参数说明:

object:被观察的对象

observer:观察者对象

keyPath:被观察对象的属性名称

写个测试程序测试一下:

Person.h

#import <Foundation/Foundation.h>

@interface Person : NSObject
{
@private
NSString *address; } @end

Person.m

#import "Person.h"
#import "Car.h" @interface Person () @property (nonatomic ,strong) NSString *name; @property (nonatomic,strong)Car *car; @end @implementation Person -(id)init
{
self=[super init];
if(self){
self =[super init];
self.car=[[Car alloc]init];
}
return self;
} @end

Car.h

#import <Foundation/Foundation.h>

@interface Car : NSObject

@end

Car.m

#import "Car.h"

@interface Car()

@property (nonatomic ,strong) NSString *brand;

@end

@implementation Car

@end

测试代码:

//添加KVO观察者
-(void)addObserver
{
[self.person addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionOld context:@"haha"]; [self.person addObserver:self forKeyPath:@"address" options:NSKeyValueObservingOptionNew context:nil]; [self.person addObserver:self forKeyPath:@"car.brand" options:NSKeyValueObservingOptionNew context:nil];
} -(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
NSLog(@"keyPath---->%@ change--->%@",keyPath,change);
} //移除KVO观察者
-(void)removeObserver
{
[self.person removeObserver:self forKeyPath:@"name"];
[self.person removeObserver:self forKeyPath:@"address"];
[self.person removeObserver:self forKeyPath:@"car.brand"];
}

IOS学习之初识KVO的更多相关文章

  1. IOS学习之初识KVC

    什么是kvc? kvc (key-value coding )键值编码,是ios 提供的一种通过key间接的来访问对象属性的一直方式. 哪些类支持kvc操作? kvc的操作方法由NSKeyValueC ...

  2. iOS学习路线图

    一.iOS学习路线图   二.iOS学习路线图--视频篇       阶 段 学完后目标 知识点 配套学习资源(笔记+源码+PPT) 密码 基础阶段 学习周期:24天       学习后目标:    ...

  3. 2015最新iOS学习线路图

    iOS是由苹果公司开发的移动操作系统,以xcode为主要开发工具,具有简单易用的界面.令人惊叹的功能,以及超强的稳定性,已经成为iPhone.iPad 和iPod touch 的强大基础:iOS 内置 ...

  4. ios 学习路线总结

    学习方法 面对有难度的功能,不要忙着拒绝,而是挑战一下,学习更多知识. 尽量独立解决问题,而不是在遇到问题的第一想法是找人. 多学习别人开源的第三方库,能够开源的库一定有值得学习的地方,多去看别的大神 ...

  5. IOS学习笔记48--一些常见的IOS知识点+面试题

      IOS学习笔记48--一些常见的IOS知识点+面试题   1.堆和栈什么区别? 答:管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制:对于堆来说,释放工作由程序员控制,容易产生memor ...

  6. iOS学习-压缩图片(改变图片的宽高)

    压缩图片,图片的大小与我们期望的宽高不一致时,我们可以将其处理为我们想要的宽高. 传入想要修改的图片,以及新的尺寸 -(UIImage*)imageWithImage:(UIImage*)image ...

  7. 【原】iOS学习之事件处理的原理

    在iOS学习23之事件处理中,小编详细的介绍了事件处理,在这里小编叙述一下它的相关原理 1.UITouch对象 在触摸事件的处理方法中都会有一个存放着UITouch对象的集合,这个参数有什么用呢? ( ...

  8. iOS学习笔记——AutoLayout的约束

    iOS学习笔记——AutoLayout约束 之前在开发iOS app时一直以为苹果的布局是绝对布局,在IB中拖拉控件运行或者直接使用代码去调整控件都会发上一些不尽人意的结果,后来发现iOS在引入了Au ...

  9. 【原】iOS学习47之第三方-FMDB

    将 CocoaPods 安装后,按照 CocoaPods 的使用说明就可以将 FMDB 第三方集成到工程中,具体请看博客iOS学习46之第三方CocoaPods的安装和使用(通用方法) 1. FMDB ...

随机推荐

  1. 【BZOJ】4245: [ONTAK2015]OR-XOR

    题意 给定一个长度为\(n(1 \le n \le 500000)\)的序列\(a_i(0 \le a_i \le 10^{18})\),将它划分为\(m(1 \le m \le n)\)段连续的区间 ...

  2. 【异常】No ManagedConnections available within configured blocking timeout

    Caused by: org.jboss.util.NestedSQLException: No ManagedConnections available within configured bloc ...

  3. 文档ID:某某 模板文件不存在,无法解析文档!

    如果是生成栏目列表时出现这样的问题]:   1.可以修改include/arc.listview.class.php这个文件. 2.复制代码     echo "模板文件不存在,无法解析文档 ...

  4. 多线程、委托、Invoke解决winform界面卡死的问题,并带开关

    一.知识点介绍 1,更新控件的内容,应该调用控件的Invoke方法. Invoke指: 在拥有控件的基础窗口句柄的线程上,用指定的参数列表执行指定委托.该方法接收一个委托类型和委托的参数,因此需要定义 ...

  5. Oracle解锁与加锁(HR用户为例)

    SQL*Plus: Release 9.2.0.4.0 - Production on Tue Jul 14 18:12:38 2009   Copyright (c) 1982, 2002, Ora ...

  6. js判断undefined类型

    js判断undefined类型 if (reValue== undefined){    alert("undefined");    }  发现判断不出来,最后查了下资料要用ty ...

  7. PHP防止跨域提交表单

    在提交的服务段的数据进行验证.   $servername=$_SERVER['SERVER_NAME'];//当前运行脚本所在服务器主机的名字.  $sub_from=$_SERVER[" ...

  8. webform 图片验证码制作

    界面:1 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.as ...

  9. PAT/字符串处理习题集(二)

    B1024. 科学计数法 (20) Description: 科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][1-9]"."[0-9]+E[+ ...

  10. ASP.NET Core 数据保护(Data Protection)【中】

    前言 上篇主要是对 ASP.NET Core 的 Data Protection 做了一个简单的介绍,本篇主要是介绍一下API及使用方法. API 接口 ASP.NET Core Data Prote ...