KVC和KVO

来源:互联网 发布:java四大特性 编辑:程序博客网 时间:2024/06/08 08:17
- (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);
}
0 0
原创粉丝点击