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. ACCEPTANCE CRITERIA FOR USER STORIES

    One of the teams I have recently coached quickly got a grasp of how to phrase user stories but found ...

  2. thrift笔记

    Thrift tutorial 演示 python服务端与客户端本文的开发环境是windows 7 + python2.7.3Thrift官方主页:http://thrift.apache.org/先 ...

  3. K线图学习

    本博文(适合入门的股民朋友)内容来自网络,股市有风险,入市需谨慎 一.起源 K线图(Candlestick Charts)又称蜡烛图.日本线.阴阳线.棒线等,常用说法是“K线”,起源于日本十八世纪德川 ...

  4. Call to undefined function Think\mb_strlen()

    在php.ini 中开启php_mbstring.dll 模块后重启 apache

  5. 五、jquery使用工具函数

    工具函数对应的网址在 http://api.jquery.com/categouy/utilities/   工具函数处理对象的不同,可以将其分为几大类别:浏览器的检测.数组和对象的操作.字符串的操作 ...

  6. C# File.Delete文件时 提示:文件引起的访问被拒绝解决方案

    new FileInfo(f).Attributes = FileAttributes.Normal; File.Delete(f);

  7. 实践Html5的上传文件

    技术点: 1.通过input的change事件获取文件信息: onchange = function() { this.files } 这个files属性是htmlInputElement接口的属性, ...

  8. MVC学习-http://www.w3school.com.cn/

    连接字符串: <add name="MovieDBContext" connectionString="Data Source=|DataDirectory|\Mo ...

  9. [每日电路图] 9、介绍一种低价简单的4.2V锂电池充电及稳压(LDO)电路——RT9193,SD8017

    消费类电子电路图设计中往往会涉及到4.2V锂离子电池充电电路.及4.2V转3.3V的LDO稳压电路,这里分享一种简单.便宜的设计方案: RT9193 300mA,Ultra-Low Noise,Ult ...

  10. ASP.NET MVC 从零开始 - 自动化部署(其二)

    这篇文章是从我的 github 博客 http://lxconan.github.io 导入的. 这是这个系列的第五篇了,前四篇请参见: ASP.NET MVC 从零开始 – Create and R ...