iOS中KVC与KVO的应用解析

简介: iOS中KVC与KVO的应用解析

iOS中KVC与KVO的应用解析


一、NSKeyValueCoding(KVC)


1、从一个小例子引入


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


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


//.h文件

#import <Foundation/Foundation.h>

@interface Model : NSObject

{

   @public//将成员变量设置为公有的 以便其他文件有访问权限

   NSString * str;

}

@end

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


   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类中有一个字符串,我们可以通过如下的方式赋值取值


//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:参数传递


监听的选项枚举如下:


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是传递的参数。


代码示例:


- (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);

   }

}

目录
相关文章
|
机器学习/深度学习 文字识别 监控
安全监控系统:技术架构与应用解析
该系统采用模块化设计,集成了行为识别、视频监控、人脸识别、危险区域检测、异常事件检测、日志追溯及消息推送等功能,并可选配OCR识别模块。基于深度学习与开源技术栈(如TensorFlow、OpenCV),系统具备高精度、低延迟特点,支持实时分析儿童行为、监测危险区域、识别异常事件,并将结果推送给教师或家长。同时兼容主流硬件,支持本地化推理与分布式处理,确保可靠性与扩展性,为幼儿园安全管理提供全面解决方案。
678 3
|
人工智能 API 开发者
HarmonyOS Next~鸿蒙应用框架开发实战:Ability Kit与Accessibility Kit深度解析
本书深入解析HarmonyOS应用框架开发,聚焦Ability Kit与Accessibility Kit两大核心组件。Ability Kit通过FA/PA双引擎架构实现跨设备协同,支持分布式能力开发;Accessibility Kit提供无障碍服务构建方案,优化用户体验。内容涵盖设计理念、实践案例、调试优化及未来演进方向,助力开发者打造高效、包容的分布式应用,体现HarmonyOS生态价值。
996 27
|
供应链 项目管理 容器
深入探索 BPMN、CMMN 和 DMN:从定义到应用的全方位解析
在当今快速变化的商业环境中,对象管理组织(OMG)推出了三种强大的建模标准:BPMN(业务流程模型和符号)、CMMN(案例管理模型和符号)和DMN(决策模型和符号)。它们分别适用于结构化流程管理、动态案例处理和规则驱动的决策制定,并能相互协作,覆盖更广泛的业务场景。BPMN通过直观符号绘制固定流程;CMMN灵活管理不确定的案例;DMN以表格形式定义清晰的决策规则。三者结合可优化企业效率与灵活性。 [阅读更多](https://example.com/blog)
深入探索 BPMN、CMMN 和 DMN:从定义到应用的全方位解析
|
数据采集 机器学习/深度学习 存储
可穿戴设备如何重塑医疗健康:技术解析与应用实战
可穿戴设备如何重塑医疗健康:技术解析与应用实战
885 4
|
存储 弹性计算 安全
阿里云服务器ECS通用型规格族解析:实例规格、性能基准与场景化应用指南
作为ECS产品矩阵中的核心序列,通用型规格族以均衡的计算、内存、网络和存储性能著称,覆盖从基础应用到高性能计算的广泛场景。通用型规格族属于独享型云服务器,实例采用固定CPU调度模式,实例的每个CPU绑定到一个物理CPU超线程,实例间无CPU资源争抢,实例计算性能稳定且有严格的SLA保证,在性能上会更加稳定,高负载情况下也不会出现资源争夺现象。本文将深度解析阿里云ECS通用型规格族的技术架构、实例规格特性、最新价格政策及典型应用场景,为云计算选型提供参考。
|
人工智能 自然语言处理 算法
DeepSeek大模型在客服系统中的应用场景解析
在数字化浪潮下,客户服务领域正经历深刻变革,AI技术成为提升服务效能与体验的关键。DeepSeek大模型凭借自然语言处理、语音交互及多模态技术,显著优化客服流程,提升用户满意度。它通过智能问答、多轮对话引导、多模态语音客服和情绪监测等功能,革新服务模式,实现高效应答与精准分析,推动人机协作,为企业和客户创造更大价值。
1133 5
|
负载均衡 JavaScript 前端开发
分片上传技术全解析:原理、优势与应用(含简单实现源码)
分片上传通过将大文件分割成多个小的片段或块,然后并行或顺序地上传这些片段,从而提高上传效率和可靠性,特别适用于大文件的上传场景,尤其是在网络环境不佳时,分片上传能有效提高上传体验。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
934 140
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
1524 29
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
611 4

热门文章

最新文章

推荐镜像

更多
  • DNS