iOS中KVC与KVO的应用解析

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 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);

   }

}

目录
相关文章
|
28天前
|
设计模式 安全 Swift
探索iOS开发:打造你的第一个天气应用
【9月更文挑战第36天】在这篇文章中,我们将一起踏上iOS开发的旅程,从零开始构建一个简单的天气应用。文章将通过通俗易懂的语言,引导你理解iOS开发的基本概念,掌握Swift语言的核心语法,并逐步实现一个具有实际功能的天气应用。我们将遵循“学中做,做中学”的原则,让理论知识和实践操作紧密结合,确保学习过程既高效又有趣。无论你是编程新手还是希望拓展技能的开发者,这篇文章都将为你打开一扇通往iOS开发世界的大门。
|
29天前
|
搜索推荐 IDE API
打造个性化天气应用:iOS开发之旅
【9月更文挑战第35天】在这篇文章中,我们将一起踏上iOS开发的旅程,通过创建一个个性化的天气应用来探索Swift编程语言的魅力和iOS平台的强大功能。无论你是编程新手还是希望扩展你的技能集,这个项目都将为你提供实战经验,帮助你理解从构思到实现一个应用的全过程。让我们开始吧,构建你自己的天气应用,探索更多可能!
52 1
|
2月前
|
IDE Android开发 iOS开发
深入解析Android与iOS的系统架构及开发环境差异
本文旨在探讨Android和iOS两大主流移动操作系统在系统架构、开发环境和用户体验方面的显著差异。通过对比分析,我们将揭示这两种系统在设计理念、技术实现以及市场策略上的不同路径,帮助开发者更好地理解其特点,从而做出更合适的开发决策。
125 2
|
7天前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
【10月更文挑战第18天】本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户按下按钮时,按钮将从圆形变为椭圆形并从蓝色渐变为绿色;释放按钮时,动画恢复原状。通过UIView的动画方法和弹簧动画效果,实现平滑自然的动画过渡。
30 5
|
21天前
|
开发工具 Android开发 iOS开发
深入解析安卓与iOS开发环境的优劣
【10月更文挑战第4天】 本文将深入探讨安卓和iOS两大主流移动操作系统的开发环境,从技术架构、开发工具、用户体验等方面进行详细比较。通过分析各自的优势和不足,帮助开发者更好地理解这两个平台的异同,从而为项目选择最合适的开发平台提供参考。
17 3
|
27天前
|
安全 Android开发 iOS开发
深入解析:安卓与iOS的系统架构及其对应用开发的影响
本文旨在探讨安卓与iOS两大主流操作系统的架构差异,并分析这些差异如何影响应用开发的策略和实践。通过对比两者的设计哲学、安全机制、开发环境及性能优化等方面,本文揭示了各自的特点和优势,为开发者在选择平台和制定开发计划时提供参考依据。
37 4
|
2月前
|
存储 IDE 开发工具
移动应用开发之旅:打造你的首个iOS应用
【9月更文挑战第23天】在数字化浪潮中,移动应用已成为连接用户与数字世界的关键桥梁。本文将带领读者踏上开发属于自己的第一个iOS移动应用的旅程,从理解移动操作系统的核心概念出发,逐步深入到实际的应用构建过程中。通过简洁明了的语言和具体的代码示例,我们将一起探索如何在苹果的iOS平台上实现一个简单的“待办事项列表”应用,让读者不仅能够学习到编程知识,还能体会到将想法转化为现实产品的成就感。无论你是编程新手还是希望扩展技能的开发者,这篇文章都将为你提供一个实用的指南,帮助你迈出成为移动应用开发者的第一步。
|
2月前
|
搜索推荐 Linux Android开发
深入解析安卓与iOS系统架构设计差异
本文旨在探讨Android和iOS两大主流操作系统在架构设计上的根本差异。通过分析两种系统的设计理念、核心组件以及实际应用表现,揭示它们如何反映不同的开发哲学和用户体验策略。我们将从系统层级结构、内存管理机制、用户界面设计三个方面入手,逐一对比Android的开放性和灵活性如何与其对手iOS的封闭性和一致性相互辉映。
|
Android开发 iOS开发
iOS开发:KVC与KVO
KVC 就是键值编码(key-value-coding),可以直接访问对象的属性,或者给对象的属性赋值。黑魔法之一,很多高级的iOS开发技巧都是基于KVC实现的。 KVO 是键值观察者(key-value-observing)。实现方式:通过对某个对象的某个属性添加观察者,当该属性改变,就会调用”observeValueForKeyPath:”方法,为我们提供一个“对象值改变了!”的时机进行一些操作。
241 0
iOS开发:KVC与KVO
|
Java iOS开发
【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态(二)
【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态(二)
134 0

推荐镜像

更多