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被改变啦! |
KVC & KVO的更多相关文章
- KVC/KVO原理详解及编程指南
一.简介 1.KVC简介 2.KVO简介 二.KVC相关技术 1.Key和Key Path 2.点语法和KVC 3.一对多关系(To-Many)中的集合访问器方法 4.键值验证(Key-Value V ...
- 【转】 KVC/KVO原理详解及编程指南
原文地址:http://blog.csdn.net/wzzvictory/article/details/9674431 前言: 1.本文基本不讲KVC/KVO的用法,只结合网上的资料说说对这种技术的 ...
- kvc/kvo复习
kvc/kvo复习 1 小问题 '[<XMGPerson 0x7fb8a8f30220> setValue:forUndefinedKey:]: this XMGPerson * pers ...
- 转:KVC/KVO原理详解及编程指南
作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/9674431 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或 ...
- 阶段性总结⓵触摸事件&手势识别⓶Quartz2D绘图⓷CALayer图层⓸CAAnimation⓹UIDynamic UI动力学⓺KVC&KVO
知识点复习 1. 触摸事件&手势识别 1> 4个触摸事件,针对视图的 2> 6个手势识别(除了用代码添加,也可以用Storyboard添加) 附加在某一个特定视图上的, ...
- IOS开发之KVC KVO KVB
KVC(Key Value Coding) KVO(Key Value Observing) KVB(Key Value Binding) KVO是Cocoa的一个重要机制,他提供了观察某一属性变化的 ...
- KVC&&&KVO
KVC 什么是KVC --->What KVC指的就是NSKeyValueCoding非正式协议. KVC是一种间接地访问对象的属性的机制. 这种间接表现在通过字符串来标识属性,而不是通过调用存 ...
- 04 KVC|KVO|Delegate|NSNotification区别
一. iOS 中KVC.KVO.NSNotification.delegate 在实际的编程中运用的非常多,掌握好他们的运行原理和使用场合对于我们程序的开发将会带来事办工倍的效果: 二. KVC ...
- 深入理解 KVC\KVO 实现机制 — KVC
KVC和KVO都属于键值编程而且底层实现机制都是isa-swizzing,所以本来想放在一起讲的.但是篇幅有限所以就分成了两篇博文 KVO实现机制传送门 KVC概述 KVC是Key Value Cod ...
随机推荐
- Torch7学习笔记(一)CmdLine
该类主要为了提供一种方便解析参数的框架,对于每个实验尤其是神经网络中要调参数上.同时还可以把输出重定向到log文件中. 一般用法: cmd = torch.CmdLine() cmd:text() c ...
- hdu 2037简单贪心--活动安排问题
活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合,是可以用贪心算法有效求解的很好例子.该问题要求高效地安排一系列争用某一公共资源的活动.贪心算法提供了一个简单.漂亮的方法使得尽可能多的活动 ...
- css3 linear-gradient实现页面加载进度条效果
最终效果图: html结构: <div> <p class="p1"> <span></span> < ...
- Python之路第一课Day6--随堂笔记(面向对象 )
本节内容: 1. 面向对象编程介绍 2. 为什么要用面向对象进行开发? 3. 面向对象的特性:封装.继承.多态 4. 类.方法 一.面向过程 VS 面向对象 1. 编程范式 编程是 程序 员 用 ...
- JavaScript鼠标经过图片的放大镜效果
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- C#3.0扩展方法学习篇
什么是类的扩展方法 扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. MSDN Extension methods enable you to &q ...
- SDOI 2016 排列计数
题目大意:一个数列A,n个元素,其中m个元素不动,其他元素均不在相应位置,问有多少种排列 保证m个元素不动,组合数学直接计算,剩余元素错位排列一下即可 #include<bits/stdc++. ...
- Android WiFi密码(查看工具)
纯手机端AIDE编写,现在分享出源码 & apk文件. 注: 使用此工具需要root权限. apk文件 : http://yunpan.cn/cHPLZ8zH5BQBV (提取码:9cd2) ...
- java 引入自定义字体font后出现的硬盘吃光的问题
有个需求要用美术字体在图片上写字 用自定义的文字有两个方法: 1. Font dynamicFont = Font.createFont(Font.TRUETYPE_FONT, InputStream ...
- XMPP iOS客户端实现一:服务器
1.下载ejabberd,下载链接http://www.process-one.net/en/ejabberd/downloads/ 2.安装,使用默认配置即可,next.. 3.启动ejabberd ...