这是OC语法中重要的部分,学习者绝对不能因为想偷懒而不学这个。
一、键值编码KVC(Key Value Coding)
相对KVO,这个比较简单。
1. 最基本的KVC由NSKeyValueCoding协议提供支持,基本的操作属性的两个方法:
setVlaue:属性值 forKey:属性名 ---》这是为指定属性设置值
valueForKey:属性名 ---》获取指定属性的值
举例:User *user = [ [ User alloc] init ] ;
[user setValue:@"孙悟空" forKey:@"name"];
NSLog( @" user的name为:%@ " , [user valueForKey:@"name"] );
打印结果:user的name为:孙悟空
2. KVC除了操作对象的属性外,还可操作对象的“复合属性”。所谓“复合属性”,简单来说,就是一个对象作为另一个对象的一个属性。KVC机制将其成为Key路径。
KVC协议中为操作Key路径的方法如下:
setValue:forKeyPath: ---》根据Key路径设置属性值
valueForKeyPath: ---》根据Key路径获取属性值
举例如下:
Apples.h
#import <Foundation/Foundation.h>
@interface Apples : NSObject
{
@private
NSString *_name;
float _price;
}
@end
Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
NSString *_name;
NSArray *_apples;
}
@end
main.m
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Apples.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
//KVC练习
Apples *mac = [[Apples alloc]init];
[mac setValue:@"macbook" forKey:@"_name"];
[mac setValue:@8000 forKey:@"price"];
Apples *iphone = [[Apples alloc]init];
[iphone setValue:@"iphone" forKey:@"_name"];
[iphone setValue:@5000 forKey:@"price"];
Apples *ipad = [[Apples alloc]init];
[ipad setValue:@"ipad" forKey:@"_name"];
[ipad setValue:@3800 forKey:@"price"];
NSArray *apples = @[mac, iphone, ipad];
Person *p = [[Person alloc]init];
[p setValue:@"乔布斯" forKey:@"name"];
[p setValue:apples forKey:@"apples"];
NSLog(@"%@",p);
//计算数组中所有price的和(运算的字段必须是数值类型NSNumber或者基本数据类型,返回NSNumber)
NSNumber *sum = [p valueForKeyPath:@"apples.<span style="color:#ff0000;">@sum</span>._price"];
NSLog(@"sum:%@",sum);
NSNumber *min = [p valueForKeyPath:@"apples.<span style="color:#ff0000;">@min</span>._price"];
NSLog(@"min:%@",min);
NSNumber *max = [p valueForKeyPath:@"apples.<span style="color:#ff0000;">@max</span>._price"];
NSLog(@"max:%@",max);
NSNumber *avg = [p valueForKeyPath:@"apples.<span style="color:#ff0000;">@avg</span>._price"];//平均值
NSLog(@"avg:%@",avg);
NSNumber *count = [p valueForKeyPath:@"apples.<span style="color:#ff0000;">@count</span>._price"];
NSLog(@"count:%@",count);
}
return 0;
}
实现监听。主要两步:
1. 注册监听
[_child addObserver:self forKeyPath:@"happyVal" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
forKeyPath是要监听的属性
2. 实现监听方法
//监听后执行的方法
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
NSLog(@"change:%@",change);
}
object代表监听的对象。change代表发生的改变。
最后,记得移除监听:重写父类dealloc方法,
- (void)dealloc
{
[_child removeObserver:self forKeyPath:@"happyVal"];
}
打印结果:
change:{
kind = 1;
new = 99;
old = 99;
}