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的更多相关文章

  1. KVC/KVO原理详解及编程指南

    一.简介 1.KVC简介 2.KVO简介 二.KVC相关技术 1.Key和Key Path 2.点语法和KVC 3.一对多关系(To-Many)中的集合访问器方法 4.键值验证(Key-Value V ...

  2. 【转】 KVC/KVO原理详解及编程指南

    原文地址:http://blog.csdn.net/wzzvictory/article/details/9674431 前言: 1.本文基本不讲KVC/KVO的用法,只结合网上的资料说说对这种技术的 ...

  3. kvc/kvo复习

    kvc/kvo复习 1 小问题 '[<XMGPerson 0x7fb8a8f30220> setValue:forUndefinedKey:]: this XMGPerson * pers ...

  4. 转:KVC/KVO原理详解及编程指南

      作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/9674431 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或 ...

  5. 阶段性总结⓵触摸事件&手势识别⓶Quartz2D绘图⓷CALayer图层⓸CAAnimation⓹UIDynamic UI动力学⓺KVC&KVO

    知识点复习   1. 触摸事件&手势识别   1> 4个触摸事件,针对视图的 2> 6个手势识别(除了用代码添加,也可以用Storyboard添加)   附加在某一个特定视图上的, ...

  6. IOS开发之KVC KVO KVB

    KVC(Key Value Coding) KVO(Key Value Observing) KVB(Key Value Binding) KVO是Cocoa的一个重要机制,他提供了观察某一属性变化的 ...

  7. KVC&&&KVO

    KVC 什么是KVC --->What KVC指的就是NSKeyValueCoding非正式协议. KVC是一种间接地访问对象的属性的机制. 这种间接表现在通过字符串来标识属性,而不是通过调用存 ...

  8. 04 KVC|KVO|Delegate|NSNotification区别

    一. iOS 中KVC.KVO.NSNotification.delegate 在实际的编程中运用的非常多,掌握好他们的运行原理和使用场合对于我们程序的开发将会带来事办工倍的效果:   二. KVC ...

  9. 深入理解 KVC\KVO 实现机制 — KVC

    KVC和KVO都属于键值编程而且底层实现机制都是isa-swizzing,所以本来想放在一起讲的.但是篇幅有限所以就分成了两篇博文 KVO实现机制传送门 KVC概述 KVC是Key Value Cod ...

随机推荐

  1. HTML5 audio与video标签实现视频播放,音频播放

    随着互联网的飞速发展以及HTML5的应用,越来越多的项目中用到video,audio当常用标签. <audio> 标签属性 <audio src="song.mp3&quo ...

  2. Torch7学习笔记(一)CmdLine

    该类主要为了提供一种方便解析参数的框架,对于每个实验尤其是神经网络中要调参数上.同时还可以把输出重定向到log文件中. 一般用法: cmd = torch.CmdLine() cmd:text() c ...

  3. nmap

    扫描端口 nmap -v -sS -open -iL iplist.txt -no-stylesheet -oX output.xml -p- -P0 -v 详细信息-sS 隐蔽扫描(半开syn).– ...

  4. php止刷新页面重复提交

    利用session来解决,首先新建一个session,并赋值,第一次提交后改变session的值,当第二次再此提交此内容时,如果不是我们的赋值,就不在处理传过来的数据.如:<?php sessi ...

  5. java并发编程(十七)Executor框架和线程池

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17465497   Executor框架简介 在Java 5之后,并发编程引入了一堆新的启动 ...

  6. JQuery 获取父级元素、同级元素、子元素等

    例: <div> <div id="div_1">这是内容1</div> <div id="div_2">这是内 ...

  7. 关于Mathematica 的cdf 文件的嵌入应用

    // // '); cdf.embed('http://files.cnblogs.com/Leonhard-E/AreaOfANormalDistribution.cdf', 635, 913); ...

  8. 跟服务器交互的登录Demo

    服务器写死 账号密码,演示登录 服务器代码: 开发工具MyEclipse public class LoginServlet extends HttpServlet { /** * The doGet ...

  9. win 8 换 win7 注意事项

    win8 换win7 硬盘格式修改一下gpt 格式转换为mbr模式 当进入到要选择安装到某一个盘时,由于磁盘的类型不同,会提示:“选中的磁盘采用GPT分区形式无法安装系统”.这时需要重新设置分区形式( ...

  10. windows或mac上对iOS设备截图

    1.需要在设备上安装插件“设置”--“开发者”的选项 2.启动"com.apple.mobile.screenshotr"服务 3.和设备scoket通讯,拿到截图.