KVC & KVO
KVC和KVO看上去又是两个挺牛的单词简写,KVC是Key-Value Coding的简写,是键值编码的意思。KVO是Key-Value Observing的简写,是键值观察的意思。那么我们能拿KVC和KVO干些什么事呢?这两个缩写单词不能否认听起来挺高端的样子。这两个方法都是runtime方法,我们先来介绍KVC。
1.KVC(Key-Value Coding)键值编码
为了测试我们建立两个测试类
测试类一:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#import <Foundation/Foundation.h> @ class SubKVCClass; @interface KVCClass : NSObject @property(copy ,nonatomic) NSString *name; @property(retain, nonatomic) SubKVCClass *subKVC; @end #import "KVCClass.h" #import "SubKVCClass.h" @implementation KVCClass -(NSString *)description { NSString *str = [NSString stringWithFormat:@ "property = %@, subName = %@" , _name, _subKVC.subName]; return str; } @end |
测试类二:
1
2
3
4
5
6
7
8
9
|
#import <Foundation/Foundation.h> @interface SubKVCClass : NSObject @property (copy, nonatomic) NSString *subName; @end #import "SubKVCClass.h" @implementation SubKVCClass @end |
(1)我们可以用键值编码给对象的属性动态赋值(必须得有标准的getter和setter方法,或者用@property声明)
我们可以调用setValue: forKey: 方法以字符串的相识向对象发送消息,可以设置实例变量的值。第一个参数是要设置的值,第二个参数是实例变量的名称
我们可以调用valueForKey: 来获取实例变量的值,废话少说,代码走起:
1
2
3
4
5
|
KVCClass *kvc = [KVCClass new ]; //通过setValue: forKey:来动态设置属性的值 [kvc setValue:@ "我是同过setValue方法设置的值" forKey:@ "name" ]; //通过valueForkey来获取值 NSLog(@ "name = %@" , [kvc valueForKey:@ "name" ]); |
代码运行结果:
1
|
2014-08-14 16:08:57.940 Memory[1414:303] name = 我是同过setValue方法设置的值 |
(2)我们可以通过键路径给实例变量是其他类的对象赋值 setValue: forKeyPath:
代码如下: 接着上面的代码来得,KVC的一项实例变量是SubKVCClass的对象
1
2
3
4
5
6
|
//通过键路径来给KVCClass中的对象的属性赋值 SubKVCClass *sub = [SubKVCClass new ]; kvc.subKVC = sub; [kvc setValue:@ "我是subName, 通过kvc的键路径来给我赋的值" forKeyPath:@ "subKVC.subName" ]; NSLog(@ "subName = %@" , [kvc valueForKeyPath:@ "subKVC.subName" ]); NSLog(@ "%@" , kvc); |
上面代码的运行结果:
1
2
|
2014-08-14 16:08:57.941 Memory[1414:303] subName = 我是subName, 通过kvc的键路径来给我赋的值 2014-08-14 16:08:57.942 Memory[1414:303] property = 我是同过setValue方法设置的值, subName = 我是subName, 通过kvc的键路径来给我赋的值 |
KVC的基本内容概就这些吧,当然啦还有在数组中使用KVC以及KVC中的运算-集合等,不做赘述啦。
2.介绍完KVC那么我们来介绍一下KVO,键值观察
键值观察是个什么东西啊?他有什么用啊?怎么用?从字面意思上说键值观察就是观察属性值的变化,也是运行时的方法,当实例变量改变时,系统会自动采取一些动作。
KVO使用三步走:
(1)注册成为观察者
(2)观察者定义KVO的回调
(3)移除观察者
来点实际的,还得上代码:
KVOClass接口:
1
2
3
4
5
|
#import <Foundation/Foundation.h> @interface KVOClass : NSObject @property(strong,nonatomic) NSString * name; @end |
KVOClass实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
#import "KVOClass.h" @implementation KVOClass //在init注册观察者 -(id) init { if (self = [super init]) { [self addObserver:self forKeyPath:@ "name" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:@ "name" ]; } return self; } //重写观察方 - ( void )observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:( void *)context { if (context == @ "name" ) { NSLog(@ "name被改变啦!" ); } else { [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; } } //移除观察者 -( void ) dealloc { [self removeObserver:self forKeyPath:@ "name" ]; [super dealloc]; } @end |
代码说明:注册观察者的时候调用addObserver方法,第一个参数是观察那个类,第二个参数是那个类中的那个属性,第三个方法是观察选项,第四个会传到下面的观察方法中
上面的代码运行结果为:
1
|
2014-08-14 16:56:16.843 Memory[1483:303] name被改变啦! |
作者:青玉伏案
出处:http://www.cnblogs.com/ludashi/
本文版权归作者和共博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
如果文中有什么错误,欢迎指出。以免更多的人被误导。
收简历:坐标美团(北京总部),长期招聘FE/iOS/Android靠谱工程师,入职后,可内部联系楼主,有小礼品赠送,有意者可邮箱投递简历:zeluli@foxmail.com
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?