IOS中KVC和KVO理解
来源:互联网 发布:安卓优化神器 编辑:程序博客网 时间:2024/05/21 17:27
什么是KVC?
KVC是Key Value coding的缩写,也就是键值编码,从名字很难理解它是做什么用的。学过java的朋友对java的反射一定不陌生,我认为KVC有点类似Java的反射(只是类似不等同于反射)。在IOS中我们为一个属性赋值通常使用Object.Property=Value的形式,那么有了KVC之后,现在我们可以换一种方式了.
比如一个Person类
@interfacePerson :NSObject
@property(retain,nonatomic)NSString*name;
@property(assign,nonatomic)NSInteger age;
@property(retain,nonatomic)Company*company;
@property(retain,nonatomic)NSArray*phones;
@end
@interfaceCompany :NSObject
@property(retain,nonatomic)NSString*companyName;
@end
使用KVC对属性赋值
我们可以使用下列方法为一个属性赋值
- (void)setValue:(id)value forKey:(NSString *)key;
- (void)setValue:(id)value forKeyPath:(NSString *)keyPath;
比如为Person中的name赋值
[personsetValue:@"ChenXin"forKey:@"name"];
或者使用
[personsetValue:@"ChenXin"forKeyPath:@"name"];
这两个方法的主要区别在于forKeyPath可以传入对象的层级路径,比如我们要对Person中的company属性中的name属性赋值我们必须使用下列方法
[personsetValue:@"EIS"forKeyPath:@"company.companyName"];
特别注意:这里的company属性必须经过实例化,如果未实例化就调用,company属性为null
使用KVC对属性取值
与赋值对应的取值方法
- (id)valueForKeyPath:(NSString *)keyPath;
获取person对象company的名称
[personvalueForKeyPath:@"company.companyName"];
KVC对数组取值
idphoneNames=[personvalueForKeyPath:@"phones.name"];
得到的是phone.name的数组
KVC的批量赋值
- (void)setValuesForKeysWithDictionary:(NSDictionary *)keyedValues;
参数:keyedValues是字典数据类型,记录了对象中属性与值的键值对
这样我们可以像Spring那样通过配置文件来实例化一个对象
举个例子,通过plist文件来初始化一个Person对象,plist文件如下
NSString *path=[[NSBundlemainBundle]pathForResource:@"person"ofType:@"plist"];
NSArray *dataArray=[NSArrayarrayWithContentsOfFile:path];
for (NSDictionary*dictindataArray) {
Person *person=[[Personalloc]init];
[personsetValuesForKeysWithDictionary:dict];
NSLog(@"%@",person);
}
什么是KVO?
KVO是key value observing,它是一种非常重要的机制,允许监听属性值的变化
- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context;
参数的含义
Observer:观察者
keyPaht:键值的路径,也就是要监听的属性
options:变化前后的新值还是旧值等
context:标志符
添加观察者
为Person的name添加观察者,当name发生变化时,会通知观察者
[paddObserver:selfforKeyPath:@"name"options:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNewcontext:@"test"];
观察者对象的观察者方法
-(void)observeValueForKeyPath:(NSString*)keyPathofObject:(id)object change:(NSDictionary*)change context:(void *)context{
NSLog(@"%@,%@,%@,%@",keyPath,object,change,context);
}
参数的含义
keyPath:键值路径
object:被观察的对象
change:变化后的值,取决于addObserver方法的options参数
移除观察者
[premoveObserver:selfforKeyPath:@"name"];
完整代码下载
- IOS中KVC和KVO理解
- iOS中KVC和KVO
- iOS kvc kvo 理解,
- iOS KVC 和KVO的真正理解
- iOS中的KVC和KVO的理解
- iOS 中KVO和KVC的使用
- iOS中KVC 和 KVO 简单介绍
- iOS 中KVC、KVO使用和介绍
- ios kvc和kvo
- iOS KVC和KVO
- iOS KVC和KVO
- ios KVC和KVO
- iOS 理解KVO与KVC
- ios中对KVO、KVC的一些理解
- ios中对KVO、KVC的一些理解
- ios中对KVO、KVC的一些理解
- KVC和KVO的理解
- KVO和KVC的理解
- VC 运行时库 /MD、/MDd 和 /MT、/MTd
- logback的前世今生
- hdu 1045 || zoj 1002 Fire Net(搜索:DFS+水题)
- java 与 phantomjs 的运用 (一)
- poj1584
- IOS中KVC和KVO理解
- 隐藏软件键盘的方法
- 连接池连接Mysql数据库
- 《Effective C++》学习笔记
- 华为加班文化害死人
- hdu1013 Digital Roots
- poj 1376 Robot (BFS)
- matlab中 mcc/mbuild/mex 区别
- HDU 1166 敌兵布阵(线段树区间和)