IOS中KVC和KVO理解

来源:互联网 发布:安卓优化神器 编辑:程序博客网 时间:2024/05/21 17:27

什么是KVC

KVCKey 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?

KVOkey value observing,它是一种非常重要的机制,允许监听属性值的变化

- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:(void *)context;

参数的含义

Observer:观察者

keyPaht:键值的路径,也就是要监听的属性

options:变化前后的新值还是旧值等

context:标志符

添加观察者

Personname添加观察者,当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"];

 

完整代码下载

0 0
原创粉丝点击