IOS中KVC与KVO的应用解析

简介:

IOS中KVC与KVO的应用解析

一、NSKeyValueCoding(KVC)

1、从一个小例子引入

KVC键值编码是Object-C为我们提供的一种对成员变量赋值的方法。在探讨其方法之前,我们先来看一个小例子:

首先,创建一个数据模型model类:

?
1
2
3
4
5
6
7
8
//.h文件
#import <Foundation/Foundation.h>
@interface Model : NSObject
{
     @ public //将成员变量设置为公有的 以便其他文件有访问权限
     NSString * str;
}
@end

我们在其他文件中有两种方法str进行赋值和取值:

?
1
2
3
4
5
     Model * model = [[Model alloc]init];
     model->str=@ "312" ; //普通方法赋值
     [model setValue:@ "321"  forKey:@ "str" ]; //kvc赋值
     NSLog(@ "%@" ,model->str); //普通方法取值
     NSLog(@ "%@" ,[model valueForKey:@ "str" ]); //kvc取值

同样的,对于用@property声明的变量,使用kvc的效果和使用点语法,setter,getter方法的效果是一样的。

2、KVC有关函数方法详解

通过上面的例子,我们已经可以简单了解KVC是干什么的了,下面是一些常用方法。

+ (BOOL)accessInstanceVariablesDirectly;

这个方法类似一个开关,默认返回为YES,表示支持KVC方式赋值,也可以在子类中将其重写,如果返回为NO,则再进行KVC会抛出异常。

- (id)valueForKey:(NSString *)key;

通过键取值

- (void)setValue:(id)value forKey:(NSString *)key;

通过字符串键给成员变量赋值

- (BOOL)validateValue:(inout id *)ioValue forKey:(NSString *)inKey error:(out NSError **)outError;

系统默认实现的方法,验证一个键值是否有效

- (NSMutableArray *)mutableArrayValueForKey:(NSString *)key;

将取到的值放入一个可变数组中

- (NSMutableOrderedSet *)mutableOrderedSetValueForKey:(NSString *)key NS_AVAILABLE(10_7, 5_0);

将取到的值放入可变的有序集合中

- (NSMutableSet *)mutableSetValueForKey:(NSString *)key;

将取到的值放入可变的集合中

- (id)valueForKeyPath:(NSString *)keyPath;
- (void)setValue:(id)value forKeyPath:(NSString *)keyPath;

上面这两个方法分别是通过路径赋值与取值,数据结构类似地图,比如在model类中有一个成员变量model2,在Model2类中有一个字符串,我们可以通过如下的方式赋值取值

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//Model.h
#import "Model2.h"
@interface Model : NSObject
{
     @ public
     NSString * str;
     Model2 * model2;
}
//Model2.h
@interface Model2 : NSObject
{
@ public
     NSString * str2;
}
@end
//其他文件
     Model * model = [[Model alloc]init];
     Model2 * model2 = [[Model2 alloc]init];
     model->model2=model2;
     [model setValue:@ "123"  forKeyPath:@ "model2.str2" ];
     NSLog(@ "%@" ,[model valueForKeyPath:@ "model2.str2" ]);


- (NSMutableArray *)mutableArrayValueForKeyPath:(NSString *)keyPath;
- (NSMutableOrderedSet *)mutableOrderedSetValueForKeyPath:(NSString *)keyPath NS_AVAILABLE(10_7, 5_0);
- (NSMutableSet *)mutableSetValueForKeyPath:(NSString *)keyPath;

上面三个方法与前面类似,只是是从路径取值的。

- (id)valueForUndefinedKey:(NSString *)key;

这个方法可以获取没有提前定义的成员变量的值,比如运行时创建的,下面这个方法是给未定义的成员变量赋值

- (void)setValue:(id)value forUndefinedKey:(NSString *)key;

注意:这两个方法默认的实现会抛出异常,子类必须重写才能使用。

- (void)setNilValueForKey:(NSString *)key;

将成员变量置为nil

- (NSDictionary *)dictionaryWithValuesForKeys:(NSArray *)keys;

根据键值获取键值对字典

- (void)setValuesForKeysWithDictionary:(NSDictionary *)keyedValues;

通过字典对成员变量同意赋值,经常使用

二、NSKeyValueObservingCustomization(KVO)

KVO是一种消息监听机制,可以在某个量发生变化的时候将消息传送给监听者,因此广泛用于传值,界面低耦合等逻辑中。KVO机制的核心是以下三个方法:

- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context;

使用这个方法注册一个监听者,参数解释如下:

observer:监听者对象

keyPath:监听的参数

options:监听选项

context:参数传递

监听的选项枚举如下:

?
1
2
3
4
5
6
7
8
typedef  NS_OPTIONS(NSUInteger, NSKeyValueObservingOptions) {
     NSKeyValueObservingOptionNew = 0x01, //回调的字典中存放新值
     NSKeyValueObservingOptionOld = 0x02, //回调的字典中存放旧值
     NSKeyValueObservingOptionInitial , //值改变前进行回调
     NSKeyValueObservingOptionPrior //改变前后都进行回调
 
};
//回调字典后面会解释


- (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath context:(void *)context ;
- (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath;

这两个方法都是用来移除监听者

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

这个方法是监听对象数据改变时回调的方法,change是一个字典,字典中根据监听的选项不同,存放不同的值(新或者旧)。context是传递的参数。

代码示例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- ( void )viewDidLoad {
     [super viewDidLoad];
     // Do any additional setup after loading the view, typically from a nib.
      model = [[Model alloc]init];
     //添加监听者
     [model addObserver:self forKeyPath:@ "str"  options:NSKeyValueObservingOptionNew context:@ "321" ];
     [model setValue:@ "qw"  forKey:@ "str" ];
}
 
- ( void )didReceiveMemoryWarning {
     [super didReceiveMemoryWarning];
     // Dispose of any resources that can be recreated.
}
-( void )observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:( void  *)context{
     if  ([keyPath isEqualToString:@ "str" ]) {
         NSLog(@ "%@" ,context);
     }
}
目录
相关文章
|
3天前
|
搜索推荐 Android开发 iOS开发
深入解析安卓与iOS操作系统的异同
安卓和iOS是目前两大主流移动操作系统,它们分别代表了开放性和封闭性的设计理念。本文将从系统架构、用户界面、应用生态等方面深入探讨安卓和iOS之间的异同,帮助读者更好地理解这两个操作系统的特点和优势。
16 3
|
4天前
|
运维 网络协议 JavaScript
Serverless 应用引擎产品使用合集之绑定自定义域名是否要确定解析设置
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
4天前
|
存储 Cloud Native NoSQL
深度解析数据库技术:核心原理、应用实践及未来展望
一、引言 在信息化高速发展的今天,数据库技术作为数据管理的基石,承载着企业运营、决策支持、大数据分析等核心功能
|
4天前
|
SQL 数据库 开发者
Liquibase中MARK_RAN与EXECUTED:解析与实战应用.
**摘要:** 了解Liquibase,一个开源的数据库版本控制工具。本文聚焦Liquibase的两个关键概念:MARK_RAN和EXECUTED。这两个概念用于标记事务执行状态,防止重复操作,提升开发效率。MARK_RAN和EXECUTED通过简单添加关键字到SQL语句中实现,确保事务唯一执行,便于问题排查和管理。由木头左带你探索数据库版本控制的奥秘!
Liquibase中MARK_RAN与EXECUTED:解析与实战应用.
|
5天前
|
消息中间件 存储 NoSQL
Celery:高效异步任务队列的深度解析与应用实践
Celery 是一个流行的 Python 分布式任务队列,用于处理耗时的异步任务,提升Web应用性能。它包括消息中间件(如RabbitMQ、Redis)、任务生产者和消费者。Celery支持异步处理、分布式执行、任务调度、结果存储和错误处理。通过一个发送邮件验证码的实例,展示了如何安装配置、定义任务、触发任务以及查看执行结果。Celery的使用能有效优化应用响应速度和资源管理。
20 3
|
6天前
|
Linux 数据库 数据库管理
Linux下的`db_checkpoint`命令:深入解析与应用
`db_checkpoint`是Linux下Berkeley DB的命令,用于触发检查点操作,保证数据库故障恢复时的一致状态。它锁定数据库、刷新内存中的写入、更新日志并解锁。在Linux中,通过命令行调用,如`db_checkpoint -h /path/to/db_home`,可配合 `-f` 强制写入,`-v` 获取详细输出。注意权限、并发性能影响及事务一致性。使用得当能提升数据库可靠性和性能。
|
7天前
|
机器学习/深度学习 人工智能 BI
解析Python解释器:从基础到应用的完整指南
解析Python解释器:从基础到应用的完整指南
|
Android开发 iOS开发
iOS开发:KVC与KVO
KVC 就是键值编码(key-value-coding),可以直接访问对象的属性,或者给对象的属性赋值。黑魔法之一,很多高级的iOS开发技巧都是基于KVC实现的。 KVO 是键值观察者(key-value-observing)。实现方式:通过对某个对象的某个属性添加观察者,当该属性改变,就会调用”observeValueForKeyPath:”方法,为我们提供一个“对象值改变了!”的时机进行一些操作。
215 0
iOS开发:KVC与KVO
|
Java iOS开发
【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态(二)
【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态(二)
120 0
|
存储 安全 C语言
【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态(一)
【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态(一)
167 0

推荐镜像

更多