KVO & KVC

作者: 英雄出少年 | 来源:发表于2018-04-11 23:32 被阅读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);


相关文章

  • KVC && KVO

    1.KVC 关于KVC和KVO,我之前的总结文章有写过,但是实际上我在平日工作里,KVC和KVO使用的相对较少,不...

  • KVO & KVC

    一、KVO 二、KVCkey value coding : 间接通过字符串类型的key取出对应的属性值

  • KVO & KVC

    KVO: KVO的全称是Key-Value Observing,俗称“键值监听”,可以用于监听某个对象属性值的改变...

  • KVC & KVO

    KVC(Key-Value Coding) KVC最常见的两个用途: 给私有的成员变量赋值(当然公有的也可以)比如...

  • KVC & KVO

    平时用 KVO 用的少啊, 基本上都是不用的那种, 以至于怎么用都不知道了。晚上下班回来,还是决定要恶补啊,毕竟看...

  • KVC & KVO

    KVC - Key Value Coding 键值编码 一、KVC 简介 KVC 是一种可以直接通过字符串 key...

  • KVC、KVO

    KVC、KVO探识(一)KVO和KVO的详细使用 KVC、KVO探识(二)KVC你不知道的东西 KVC、KVO探识...

  • KVC,KVO

    KVC , KVO KVC和KVO的区别及应用 KVC/KVO原理 1. KVC键值编码 KVC,即是指NSKey...

  • KVC KVO高阶应用

    KVC KVO高阶应用 KVC KVO高阶应用

  • GNUstep KVC/KVO探索(二):KVO的内部实现

    GNUstep KVC/KVO探索(一):KVC的内部实现GNUstep KVC/KVO探索(二):KVO的内部实...

网友评论

      本文标题:KVO & KVC

      本文链接:https://www.haomeiwen.com/subject/omdtkftx.html