



下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 临床肿瘤内科诊疗体系与发展趋势
- Brand KPIs for sauces condiments Tabasco in the United Kingdom-外文版培训课件(2025.2)
- 集体水库管理协议书
- 菜地承包出售协议书
- 顾客签订保障协议书
- 项目借款投资协议书
- 鞋面加工合同协议书
- 风管厂家转让协议书
- 车祸自行协商协议书
- 计划财产分割协议书
- 2025解题觉醒邓诚数学(名师大招册)
- 第四单元第一课 多姿多彩的乐音世界-《唱脸谱》 课件 2024-2025学年湘艺版(2024)初中音乐七年级下册
- 给小朋友科普化学小知识
- 中医专科护士进修汇报
- 9.2 法律保障生活课件(共13张)-2024-2025学年统编版道德与法治七年级下册
- 《装备测试性工作要求GJB 2547B-2024》知识培训
- 北非旅游地理
- 体重管理培训课件
- EPC工程合作框架协议书范本
- 人教版八年级英语下册导学案(全册 共10个单元)
- 外科学-上肢骨、关节损伤
评论
0/150
提交评论