KVO & KVC

2018-04-11  本文已影响3人  英雄出少年

一、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);


上一篇 下一篇

猜你喜欢

热点阅读