文档章节

kvo kvc

爱斯基摩土著
 爱斯基摩土著
发布于 2015/04/08 12:02
字数 728
阅读 67
收藏 0

Key-Value Coding (KVC)

KVC,即是指 NSKeyValueCoding,一个非正式的 Protocol,提供一种机制来间接访问对象的属性。KVO 就是基于 KVC 实现的关键技术之一。

一个对象拥有某些属性。比如说,一个 Person 对象有一个 name 和一个 address 属性。以 KVC 说法,Person 对象分别有一个 value 对应他的 name 和 address 的 key。 key 只是一个字符串,它对应的值可以是任意类型的对象。从最基础的层次上看,KVC 有两个方法:一个是设置 key 的值,另一个是获取 key 的值。如下面的例子:

?

1
2
3
4
5
6
7
8
9
10
11
12
void changeName(Person *p, NSString *newName)
{
 
     // using the KVC accessor (getter) method
     NSString *originalName = [p valueForKey:@ "name" ];
 
     // using the KVC  accessor (setter) method.
     [p setValue:newName forKey:@ "name" ];
 
     NSLog(@ "Changed %@'s name to: %@" , originalName, newName);
 
}

现在,如果 Person 有另外一个 key 配偶(spouse),spouse 的 key 值是另一个 Person 对象,用 KVC 可以这样写:

?

1
2
3
4
5
6
7
8
9
10
11
12
13
void logMarriage(Person *p)
{
 
     // just using the accessor again, same as example above
     NSString *personsName = [p valueForKey:@ "name" ];
 
     // this line is different, because it is using
     // a "key path" instead of a normal "key"
     NSString *spousesName = [p valueForKeyPath:@ "spouse.name" ];
 
     NSLog(@ "%@ is happily married to %@" , personsName, spousesName);
 
}

key 与 key pat 要区分开来,key 可以从一个对象中获取值,而 key path 可以将多个 key 用点号 “.” 分割连接起来,比如:

[p valueForKeyPath:@ "spouse.name" ];

相当于这样……

[[p valueForKey:@ "spouse" ] valueForKey:@ "name" ];

好了,以上是 KVC 的基本知识,接着看看 KVO。

Key-Value Observing (KVO)

Key-Value Observing (KVO) 建立在 KVC 之上,它能够观察一个对象的 KVC key path 值的变化。举个例子,用代码观察一个 person 对象的 address 变化,以下是实现的三个方法:

  • watchPersonForChangeOfAddress: 实现观察

  • observeValueForKeyPath:ofObject:change:context: 在被观察的 key path 的值变化时调用。

  • dealloc 停止观察

 

?

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
static NSString * const KVO_CONTEXT_ADDRESS_CHANGED = @ "KVO_CONTEXT_ADDRESS_CHANGED"
 
@implementation PersonWatcher
 
-( void ) watchPersonForChangeOfAddress:(Person *)p
{
 
     // this begins the observing
     [p addObserver:self
         forKeyPath:@ "address"
            options:0
            context:KVO_CONTEXT_ADDRESS_CHANGED];
 
     // keep a record of all the people being observed,
     // because we need to stop observing them in dealloc
     [m_observedPeople addObject:p];
}
 
// whenever an observed key path changes, this method will be called
- ( void )observeValueForKeyPath:(NSString *)keyPath
                       ofObject:(id)object
                         change:(NSDictionary *)change
                        context:( void *)context
 
{
     // use the context to make sure this is a change in the address,
     // because we may also be observing other things
     if (context == KVO_CONTEXT_ADDRESS_CHANGED) {
         NSString *name = [object valueForKey:@ "name" ];
         NSString *address = [object valueForKey:@ "address" ];
         NSLog(@ "%@ has a new address: %@" , name, address);
     }
}
 
-( void ) dealloc;
{
 
     // must stop observing everything before this object is
     // deallocated, otherwise it will cause crashes
     for (Person *p in m_observedPeople){
         [p removeObserver:self forKeyPath:@ "address" ];
     }
 
     [m_observedPeople release];
     m_observedPeople = nil;
 
     [super dealloc];
 
}
 
-(id) init;
{
     if (self = [super init]){
         m_observedPeople = [NSMutableArray new ];
     }
 
     return self;
}
 

这就是 KVO 的作用,它通过 key path 观察对象的值,当值发生变化的时候会收到通知。


本文转载自:http://magicalboy.com/kvc_and_kvo/

共有 人打赏支持
爱斯基摩土著
粉丝 0
博文 1
码字总数 0
作品 0
成都
KVC/KVO 的使用及原理分析

KVC/KVO 概念 KVC : 即 Key-Value-Coding,用于键值编码。作为 cocoa 的一个标准化组成部分,它是基于 NSKeyValueCoding 非正式协议的机制。简单来说,就是直接通过 key 值对对象的属性进行...

满脸胡茬的小码农
2017/11/14
0
0
KVC 与 KVO 理解

KVC 与 KVO 是 Objective C 的关键概念,个人认为必须理解的东西,下面是实例讲解。 Key-Value Coding (KVC) KVC,即是指 NSKeyValueCoding,一个非正式的 Protocol,提供一种机制来间接访问...

Im刘亚芳
2014/12/04
0
0
KVO和KVC的关系

KVC 与 KVO 是 Objective C 的关键概念,个人认为必须理解的东西,下面是实例讲解。 Key-Value Coding (KVC) KVC,即是指 NSKeyValueCoding,一个非正式的 Protocol,提供一种机制来间接访问...

刘三火
2016/04/21
44
0
KVC与KVO的相关文章

1、KVC与KVO的理解:http://magicalboy.com/kvcandkvo/ 2、官方KVC文档: https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/KeyValueCoding/Articles/KeyValueCodin......

hejunbinlan
2016/06/02
12
0
OC中类的扩展

类的属性写在 .h 文件里面可以被继承的子类使用 类的属性写在 .m 大括号内,只能被本类使用 读取项目文件中的文件 - (void)viewDidLoad { [super viewDidLoad]; //读取项目文件中的文件 //创...

Dumplings
2016/03/31
38
0

没有更多内容

加载失败,请刷新页面

加载更多

VS code编辑器安装 php7.2 NTS 版本 Xdebug

本文使用的是 phpstudy 一键安装包(windows32位) php 版本是 php7.2 NTS 1、在 phpstudy 面板中开启 phpdebug 扩展 // 其他选项菜单-> php 扩展与设置-> php 扩展 2、官方下载 Xdebug // ...

削个椰子皮_给个梨
27分钟前
1
0
Swagger中配置了@ApiModelProperty的allowableValues属性但不显示的问题

现在用Swagger来生成API文档的例子已经非常多了,今天碰到开发同事问了一个问题,帮着看了一下,主要还是配置方法的问题,所以记录一下。如果您也碰到了同样的问题,希望本文对您有用。 问题...

程序猿DD
58分钟前
3
0
sql 命令

show variables like '%general%'; show variables like '%log_output%'; show variables like '%quer%'; show global status like '%slow%';...

JavaSon712
今天
4
0
Django修改默认数据库引擎

Django默认数据库引擎为sqlite3,除了sqlite3,还支持postgresql、mysql、oracle 配置如下:其中postgresql_psycopg2为postgresql的适配器。 'django.db.backends.postgresql' 'django.db.bac......

MichaelShu
今天
0
0
动画源码解析

目录介绍 1.Animation和Animator区别 2.Animation运行原理和源码分析 2.1 基本属性介绍 2.2 如何计算动画数据 2.3 什么是动画更新函数 2.4 动画数据如何存储 2.5 Animation的调用 3.Animator...

潇湘剑雨
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部