OC中的KVO

2024-03-12 03:32
文章标签 oc kvo

本文主要是介绍OC中的KVO,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

看官们,我们在前面章回中介绍了OC中的KVC,本章回中将介绍OC中的KVO。

我们说的KVO是Key Value Observing的缩写,它主要用来监听类属性的变化,它是在NSObject类中实现的,通常情况下我们定义的类只需要继承NSObject类就可以使用KVO来监听类属性的变化。下面是KVO的使用方法:


1.给属性注册监听器


 

- (void)addObserver:(NSObject *)observerforKeyPath:(NSString *)keyPathoptions:(NSKeyValueObservingOptions)optionscontext:(void *)context;


访方法用来给属性添加监听器,第一个参数observer表示属性所属的对象,通常我们写成self。第二个参数是属性的名称。第三个参数表示监听的事件,或者说发生什么事件后我们才能监听到消息,该参数是NSKeyValueObservingOptions类型的值,它是一个枚举类型,包含四个枚举常量,我们在这里不详细介绍它们,大家可以参考官方文档,通常情况下,我们使用NSKeyValueObservingOptionNew这个枚举常量,它表示属性值发生变化这个事件,或者说我们可以监听到属性值发生变化后的事件。第四个参数是context,我们不需要关注,通常写成nil就可以。


2.重写监听器方法


-

 (void)observeValueForKeyPath:(NSString *)keyPathofObject:(id)objectchange:(NSDictionary<NSKeyValueChangeKey, id> *)changecontext:(void *)context;


该方法是系统提供的方法,当被监听的事件发生后系统会调用该方法,我们重写它时只需要把事件发生后程序需要做的事情写到此方法中就可以。

第一个参数是被监听的属性名称;第二个参数是属性所属的对象;第三个参数是一个字典,字典中的key是框架提供的NSString类型的常量,我们直接拿来使用就可以,常用的是NSKeyValueChangeNewKey这个常量,它表示被监听属性值变化后的key,通过此Key可以在字典change中获取到被监听属性值变化后的value.通俗点说就是属性的新值。除了这个常量外,框架还提供了其它四个NSString类型的常量,我们在这里就不一一介绍发,大家参考官方文档就可以。需要注意的是这个常量需要和注册监听器时NSKeyValueObservingOptions类型的枚举常量匹配,不然获取不到相关的值。比如想知道属性被修改前的值,那么在注册监听器时需要使用NSKeyValueObservingOptionOld枚举常量,然后通过NSKeyValueChangeOldKey从change这个字典中获取属性被修改前的值。大家在实践时可以打开代码中被注释掉的代码来做验证。第四个参数暂时不需要关注;


3.给属性注销监听器


- (void)removeObserver:(NSObject *)observerforKeyPath:(NSString *)keyPath;


访方法用来注销属性的监听器,第一个参数observer表示属性所属的对象,通常我们写成self。第二个参数是属性的名称。


介绍完KVO的操作步骤和具体的方法后,接下来通过具体的代码来演示如何使用KVO。此代码是在KVC示例代码的基础上写的,代码中添加了相关的注释以方便大家理解代码。

#include<Foundation/Foundation.h>//定义一个名叫Person的类并且实现该类
@interface Person : NSObject
@property NSString *name;
@property int age;-(void) print;
-(void) addObserver;
-(void) removeObserver;@end@implementation Person
@synthesize name;
@synthesize age;-(void) print 
{NSLog(@"Person name: %@, age: %d",name,age);
}//给name属性注册监听器
-(void) addObserver
{[self addObserver:self forKeyPath:@"name"options:NSKeyValueObservingOptionNew context:nil];// [self addObserver:self forKeyPath:@"name"// options:NSKeyValueObservingOptionOld context:nil];NSLog(@"add Observer for key: name");
}//重写监听属性的方法,当属性变化时回调该方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey, id> *)change context:(void *)context 
{NSString *oldValue = [change objectForKey:NSKeyValueChangeOldKey];NSString *newValue = [change objectForKey:NSKeyValueChangeNewKey];NSLog(@"KVO key: %@, old value: %@ ,new value: %@",keyPath,oldValue,newValue);
}//注销属性的监听器
-(void) removeObserver
{[self removeObserver:self forKeyPath:@"name"];NSLog(@"remove observer for key: name");
}
@endint main()
{Person * p1 = [[Person alloc] init];Person * p2 = [[Person alloc] init];//在修改属性前注册监听器[p1 addObserver];//通过setter方法给类的属性赋值,通过getter方法获取类的属性值[p1 setName:@"ZhangSan"];[p1 setAge:26];[p1 print];[p1 setName:@"WangWu"];NSLog(@"p1: name: %@, age: %d",[p1 name],[p1 age]);//属性修改完成后注销监听器。可以在注册和注销监听器之间查看是否可以监听到属性变化的消息[p1 removeObserver];//p2对象没给属性没有给属性注册监听器,不会监听到属性变化的消息;//通过KVC方法给类的属性赋值,并且获取类的属性值[p2 setValue:@"LiSi" forKey:@"name"];[p2 setValue:@"LiSi" forKey:@"name"];[p2 setValue:[NSNumber numberWithInt:33] forKey:@"age"];[p2 print];NSLog(@"p2: name: %@, age: %@",[p2 valueForKey:@"name"],[p2 valueForKey:@"age"]);
}

我们在代码中新定义了两个方法,用来注册和注销监听器,同时重写了监听器的方法,这三个方法就是刚才介绍KVO三个步骤的体现,在main方法中则是对KVO三个步骤的综合应用。我们在这里就不列出程序运行结果了希望大家自己动手去实践。


最后我们对本章回的内容做一个总结:

  • 1.只需要继承NSObject类就可以使用KVO;
  • 2.使用KVO时主要包含注册、重写、注销监听器三个步骤;
  • 3.只有注册了监听器的属性才能监听到属性变化的消息;
  • 4.注册监听器时使用的事件类型与监听器中获取属性值使用的事件类型(字典中的key)需要匹配;

看官们,本章回的内容就介绍到这里,欲知后事如何且听下回分解! 

这篇关于OC中的KVO的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/800011

相关文章

保姆级教学:OC监听网络状态变化 Reachability监听网络变化 ios网络变化

本文主要讲解了,在oc开发中,怎么去使用代码进行网络监听,十分的通俗易懂。 首先,在xcode工程中导入SystemConfiguration框架。 然后导入Reachability.h文件。 Reachability文件 点击下载,也可以按照如下内容创建对应的文件。 Reachability.m //文件名Reachability.m/*Copyright (C) 2016 App

iOS--KVO的实现原理与具体应用

iOS--KVO的实现原理与具体应用 本文分为2个部分:概念与应用。 概念部分旨在剖析KVO这一设计模式的实现原理,应用部分通过创建的项目,以说明KVO技术在iOS开发中所带来的作用; 如果是作为是刚接触KVO的初学者,可以在了解基本原理后粗略看几遍底层实现原理,再认真阅读第二部分的应用内容“学会”怎么去使用KVO,往后再慢慢深入了解KVO这一“黑魔法”技术的实现原理。 【本次开发环境:

oc中关于pch文件

pch 可以用来存储共享信息,比如设备屏幕的宽度,高度。版本号等等 公用信息 Xcode 老版本会自动为我们创建pch文件,新版本开始不自动创建了,如果需要使用可以自己手动创建 创建完成后可以在里面定义常量 此处以屏幕尺寸为例 如下 代码如下: 复制代码代码如下: //获取屏幕 宽度、高度 #define SCREEN_FRAME ([UIScreen

oc 图片变黑白

理论依据: 所谓颜色或灰度级指黑白显示器中显示像素点的亮暗差别,在彩色显示器中表现为颜色的不同,灰度级越多,图像层次越清楚逼真。灰度级取决于每个像素对应的刷新 存储单元的位数和显示器本身的性能。如每个象素的颜色用16位 二进制数表示,我们就叫它16位图,它可以表达2的16次方即65536种颜色。如每一个象素采用24位二进制数表示,我们就叫它24位图,它可以表达2的24次方即16777

OC中数组、字典、集合常用方法的运用

/* ====================== 一 NSArray========================          1.创建对象          1.1初始化方法(2) //一般程序有问题先检查初始化          1.2类方法          1.3字面量方法          2.数组查找          2.1通过下标访问对象[ .[i]]

iOS开发:OC篇:常用字符串方法的运用

1 NSString   .1创建 alloc init stringWith   .2获取长度.length   .3获取字符 characterAtIndex   .4前缀和后缀的判断 hasPrefix hasSuffix   .5某个字符串在另一个字符串的范围(range)(NSMakeRange) rangeOfString   .6截取(sub) substringFro

OC中的分类与类扩展

在OC中,对于已有的类进行扩展,我们有两种方式: 1、在原始类的定义中,进行代码扩展。 2、通过继承的方式,扩展子类。 3、使用分类的方式。 第一、二种方式不用多说,第三种方式则是OC中比较有特色的功能。 分类允许我们在不更改类的原始代码的情况下,实现对类的功能扩展,包括:添加实例方法,类方法与实例变量,属性(添加实例变量与属性需要匿名分类——类扩展)。 如何定义分类\类扩展

「OC」剪不断,理还乱——UIResponder、UIGestureRecognizer、UIControl的响应优先级探究

「OC」剪不断,理还乱——UIResponder、UIGestureRecognizer、UIControl的响应优先级探究 文章目录 「OC」剪不断,理还乱——UIResponder、UIGestureRecognizer、UIControl的响应优先级探究前言介绍UIResponderUIGestureRecognizerUIControl 正文UIGestureRecognizer和

OC学习总结之异步连接

哎, 前几天去了趟韩国, 浪了几天.  一直没机会写博客. 这不回来的第一天上班就是儿童节,祝大家节日快乐哈..不吹牛逼了   直接搞起 1、同步连接和异步连接 同步连接是iOS中网络连接的一种方式,当请求的数据量小时,同步连接是一个很好的选择。UI“冻结”是它的一个缺点。 同步连接步骤: //新建一个URL        NSURL *url = [NSURL URL

NSNotification、delegate和KVO的…

1.效率肯定是delegate比nsnotification高。 2. delegate方法比notification更加直接,最典型的特征是,delegate方法往往需要关注返回值, 也就是delegate方法的结果。比如-windowShouldClose:,需要关心返回的是yes还是no。所以delegate方法往往包含 should这个很传神的词。也就是好比你做我的delegat