【移动应用开发技术】iOS开发中KVC、KVO简介_第1页
【移动应用开发技术】iOS开发中KVC、KVO简介_第2页
【移动应用开发技术】iOS开发中KVC、KVO简介_第3页
【移动应用开发技术】iOS开发中KVC、KVO简介_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】iOS开发中KVC、KVO简介

在iOS开发中,KVC和KVO是经常被用到的。可以使用KVC对对象的属性赋值和取得对象的属性值,可以使用KVO监听对象属性值的变化。简单介绍一下KVC和KVO。一:键值编码(KVC)KVC,全称KeyValueCoding(键值编码),是OC语言的一个特性,使用KVC,可以对对象的属性进行动态读写。KVC的操作方法由NSKeyValueCoding协议提供,而NSObject已经实现了这个协议,因此OC中的几乎所有对象都可以使用KVC操作。常用的KVC操作方法有:(1)设置属性值setValue:valueforKey:key(用于简单路径,也就是直接属性)setValue:valueforKeyPath:key(用于复杂路径,也就是间接属性)(2)获取属性值valueForKey:key

(用于获取简单路径的属性值)valueForKeyPath:key(用于获取复杂路径的属性值)通过代码来看KVC的具体使用:两个类分别是Dog类和Person类Dog.h1

#import

<Foundation/Foundation.h>2

3

@interface

Dog

:

NSObject4

5

@property

(nonatomic,

copy)

NSString

*name;6

7

@endDog.m1

#import

"Dog.h"2

3

@implementation

Dog4

5

@endPerson.h

1

#import

<Foundation/Foundation.h>

2

3

@class

Dog;

4

5

@interface

Person

:

NSObject

6

7

@property

(nonatomic,

copy)

NSString

*name;

8

@property

(nonatomic,

copy)

NSString

*sex;

9

10

@property

(nonatomic,

strong)

Dog

*dog;11

12

@endPerson.m1

#import

"Person.h"2

3

@implementation

Person4

5

@endKVC的使用:

1

Person

*person

=

[[Person

alloc]

init];

2

//kvc

设置值

3

[person

setValue:@"Jim"

forKey:@"name"];

4

[person

setValue:@"boy"

forKey:@"sex"];

5

6

//kvc

获得值

7

NSLog(@"name

=

%@

sex

=

%@",[person

valueForKey:@"name"],[person

valueForKey:@"sex"]);

8

9

Dog

*dog

=

[[Dog

alloc]

init];10

person.dog

=

dog;11

//kvc

设置复杂路径值12

[person

setValue:@"Teddy"

forKeyPath:@""];13

//kvc

获得复杂路径值14

NSLog(@"dog

name

=

%@",[person

valueForKeyPath:@""]);可以看到,KVC使用对应的函数即可设置值、获得值。那么,KVC是如何查找一个属性进行读取呢?KVC遵循下面的规则,假设要对name属性进行读取:(1)设置属性:优先考虑setName方法;如果没有,则搜索成员变量_name;如果没找到,则搜索成员变量name;如果还没有找到,则调用

setValue:forUndefineKey:

方法。(2)读取属性:优先考虑getName方法;如果没有,则搜索成员变量_name;如果没找到,则搜索成员变量name;如果还没有找到,则调用

valueForUndefineKey:

方法。二:KVC中setValuesForKeysWithDictionary:的使用KVC中有一个非常重要的方法:setValuesForKeysWithDictionary:dict,该方法可以将一个字典映射到一个对象,省去了给对象一一赋值的步骤。使用setValuesForKeysWithDictionary:dict的一个例子:student.h

1

#import

<Foundation/Foundation.h>

2

3

@interface

Student

:

NSObject

4

5

/**

6

*

学号

7

*/

8

@property

(nonatomic,

copy)

NSString

*num;

9

/**10

*

姓名11

*/12

@property

(nonatomic,

copy)

NSString

*name;13

/**14

*

身高15

*/16

@property

(nonatomic,

assign)

float

height;17

18

/**19

*

初始化的两个方法20

*21

*/22

-

(instancetype)initWithDict:(NSDictionary

*)dict;23

+

(instancetype)stuWithDict:(NSDictionary

*)dict;24

25

27

28

@end

student.m

-

(instancetype)initWithDict:(NSDictionary

*

(self

=

+

(instancetype)stuWithDict:(NSDictionary

*用一个字典初始化对象

1

-

(void)initStudent

2

{

3

NSDictionary

*dict

=

[NSDictionary

dictionaryWithObjectsAndKeys:

4

@"Tom",@"name",

5

@"110",@"num",

6

@"170.0",@"height",

7

nil];

8

Student

*stu

=

[[Student

alloc]

initWithDict:dict];

9

NSLog(@"name

=

%@

num

=

%@

height

=

%f",,stu.num,stu.height);10

}setValuesForKeyWithDictionary:dict

的原理实际上,setValuesForKeyWithDictionary:dict方法就是遍历dict,对dict中的每个键值调用setValue:forKey:方法。可以用下面的方法模拟setValuesForKeyWithDictionary:dict:1

-

(void)

setProperty:(NSDictionary

*)dict2

{3

for(NSString

*key

in

[dict

allKeys])4

{5

NSString

*value

=

[dict

objectForKey:key];6

[self

setValue:value

forKey:key];7

}8

}调用时:1

-

(instancetype)initWithDict:(NSDictionary

*)dict{2

if(self

=

[super

init]){3

//[self

setValuesForKeysWithDictionary:dict];4

[self

setProperty:dict];5

}6

return

self;7

}和setValuesForKeyWithDictionary:dict功能是一样的。使用setValuesForKeyWithDictionary:dict一个需要注意的地方当字典中有某个值,而对象没有相应的属性时,会发生崩溃。比如,新的字典如下:

1

-

(void)initStudent

2

{

3

NSDictionary

*dict

=

[NSDictionary

dictionaryWithObjectsAndKeys:

4

@"Tom",@"name",

5

@"110",@"num",

6

@"170.0",@"height",

7

@"boy",@"sex",nil];

8

Student

*stu

=

[[Student

alloc]

initWithDict:dict];

9

NSLog(@"name

=

%@

num

=

%@

height

=

%f",,stu.num,stu.height);10

}字典中有sex属性,但是Studeng对象中没有这个属性,此时会发生崩溃。解决方法:实现setValue:

forUndefineKey:

方法,在该方法中处理出现没有属性的情况。student.h中添加代码:1

-

(void)setValue:(id)value

forUndefinedKey:(NSString

*)key;student.m中添加代码:1

-

(void)setValue:(id)value

forUndefinedKey:(NSString

*)key2

{3

4

}当出现没有属性的情况时,就会调用setValue:forUndefineKey:方法。因为该方法没做处理,所以这种情况不做处理,不会发生崩溃。需要注意的是:setValue:forUndefineKey:方法用途很广泛,比如说字典中某个key值为id,但是在OC中id是关键字,这种情况也可以在

setValue:forUndefineKey:方法中处理。三:键值监听(KVO)KVO全称KeyValueObserving。使用KVO可以实现视图组件和数据模型的分离,视图作为监听器,当模型的属性值发生变化后,监听器可以做相应的处理。KVO的方法由NSKeyValueObserving协议提供,同样NSObject已经实现了该协议,因此几乎所有的对象都可以使用KVO。使用KVO操作常用的方法如下:注册制定路径的监听器:addObserver:

forKeyPath:option:context:删除制定路径的监听器:removeObserver:forKeyPath:触发监听时的方法:observeValueForKeyPath:ofObject:change:context:

一个KVO的例子:有两个类:Dog类和People类Dog.h

1

#import

<Foundation/Foundation.h>2

3

@interface

Dog

:

NSObject4

5

@property

(nonatomic,

copy)

NSString

*name;6

7

@end

Dog.m1

#import

"Dog.h"2

3

@implementation

Dog4

5

@endPeople.h

1

#import

<Foundation/Foundation.h>

2

3

@class

Dog;

4

5

@interface

People

:

NSObject

6

7

@property

(nonatomic

,

copy)

NSString

*name;

8

@property

(nonatomic

,

strong)

Dog

*dog;

9

10

@endPeople.m

1

#import

"People.h"

2

#import

"Dog.h"

3

4

@implementation

People

5

6

/**

7

*

初始化时增加对dog的监听

8

*

9

*/10

-

(void)setDog:(Dog

*)dog11

{12

_dog

=

dog;13

[self.dog

addObserver:self

forKeyPath:@"name"

options:NSKeyValueObservingOptionNew

context:nil];14

}15

/**16

*

重写observeValueForKeyPath方法17

*/18

-

(void)observeValueForKeyPath:(NSString

*)keyPath

ofObject:(id)object

change:(NSDictionary<NSString

*,id>

*)change

context:(void

*)context19

{20

if([keyPath

isEqualToString:@"name"]){21

NSLog(@"newNa

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论