一、KVO
TGPerson *p = [[TGPerson alloc] init];
p.age = 20;
self.p = p;
[p addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil];
//NSKeyValueObservingOptionNew 可以不传,可以获取到改变后的新值
p.age = 30;
p.age = 40;
/**
* 当监控的某个属性的值改变了就会调用
*
* @param keyPath 属性名(哪个属性改了?)
* @param object 哪个对象的属性被改了?
* @param change 属性的修改情况(属性原来的值、属性最新的值)
* @param context void * == id
*/
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
// 获取属性新值 [object valueForKeyPath:keypath]
NSLog(@"%@对象的%@属性改变了:%@", object, keyPath, change);
}
//控制器释放的时候移除KVO监听
- (void)dealloc
{
[self.p removeObserver:self forKeyPath:@"age"];
}
二、KVC
key value coding : 间接通过字符串类型的key取出对应的属性值
// KVC的作用
// 1.可以访问私有成员变量的值
// 2.可以间接修改私有成员变量的值(替换系统自带的导航栏、tabbar)
TGPerson *p = [[TGPerson alloc] init];
p.age = 20;
NSLog(@"年龄=%d", p.age);
NSLog(@"年龄=%d", [p age]);
NSLog(@"%f", [[p valueForKey:@"_height"] floatValue]);//默认做法先访问get方法 ,在访问成员变量
float h1 = [[p valueForKey:@"height"] floatValue];
float h2 = [[p valueForKeyPath:@"height"] floatValue];
NSLog(@"%f %f", h1, h2);
p.dog = [[HMDog alloc] init];
p.dog.name = @"wangcai";
NSLog(@"%@", [p valueForKeyPath:@"dog.name"]);
// keyPath包含了key的功能
// key:只能访问当前对象的属性
// keyPath:能利用.运算符一层一层往内部访问属性
3. 统计
TGBook *b1 = [[TGBook alloc] init];
b1.name = @"kuihua";
b1.price = 100.6;
HMBook *b2 = [[HMBook alloc] init];
b2.name = @"pixie";
b2.price = 5.6;
HMBook *b3 = [[HMBook alloc] init];
b3.name = @"jiuyin";
b3.price = 50.6;
p.books = @[b1, b2, b3];
NSLog(@"%@", [p valueForKeyPath:@"books.@count"]); // 计算数组的长度
NSArray *names = [p valueForKeyPath:@"books.name"];
NSArray *names = [p.books valueForKeyPath:@"name"];
NSLog(@"%@", names);
求和
double sumPrice = [[p valueForKeyPath:@"books.@sum.price"] doubleValue];
NSLog(@"%f", sumPrice);
网友评论