- (void)testKvc
{
// key value coding : 间接通过字符串类型的key取出对应的属性值
// KVC的价值
// 1.可以访问私有成员变量的值
// 2.可以间接修改私有成员变量的值(替换系统自带的导航栏、tabbar)
HMPerson *p = [[HMPerson alloc] init];
// p.age = 20;
// NSLog(@"年龄=%d", p.age);
// NSLog(@"年龄=%d", [p age]);
// int age = [[p valueForKey:@"age"] intValue];
// NSLog(@"年龄=%d", age);
// NSLog(@"%f", [[p valueForKey:@"height"] floatValue]);
// 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:能利用.运算符一层一层往内部访问属性
HMBook *b1 = [[HMBook 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);
}
- (void)testKvo
{
HMPerson *p = [[HMPerson alloc] init];
p.age = 20;
[p addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil];
p.age = 30;
p.age = 40;
self.p = p;
}
- (void)dealloc
{
[self.p removeObserver:self forKeyPath:@"age"];
}
- (void)settingImage:(UIImage *)image
{
}
/**
* 当监控的某个属性的值改变了就会调用
*
* @param keyPath 属性名(哪个属性改了?)
* @param object 哪个对象的属性被改了?
* @param change 属性的修改情况(属性原来的值、属性最新的值)
* @param context void * == id
*/
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
NSLog(@"%@对象的%@属性改变了:%@", object, keyPath, change);
}
{
// key value coding : 间接通过字符串类型的key取出对应的属性值
// KVC的价值
// 1.可以访问私有成员变量的值
// 2.可以间接修改私有成员变量的值(替换系统自带的导航栏、tabbar)
HMPerson *p = [[HMPerson alloc] init];
// p.age = 20;
// NSLog(@"年龄=%d", p.age);
// NSLog(@"年龄=%d", [p age]);
// int age = [[p valueForKey:@"age"] intValue];
// NSLog(@"年龄=%d", age);
// NSLog(@"%f", [[p valueForKey:@"height"] floatValue]);
// 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:能利用.运算符一层一层往内部访问属性
HMBook *b1 = [[HMBook 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);
}
- (void)testKvo
{
HMPerson *p = [[HMPerson alloc] init];
p.age = 20;
[p addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil];
p.age = 30;
p.age = 40;
self.p = p;
}
- (void)dealloc
{
[self.p removeObserver:self forKeyPath:@"age"];
}
- (void)settingImage:(UIImage *)image
{
}
/**
* 当监控的某个属性的值改变了就会调用
*
* @param keyPath 属性名(哪个属性改了?)
* @param object 哪个对象的属性被改了?
* @param change 属性的修改情况(属性原来的值、属性最新的值)
* @param context void * == id
*/
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
NSLog(@"%@对象的%@属性改变了:%@", object, keyPath, change);
}