kvo与kvc

1.KVC(键值编码)是一种间接访问对象实例变量的机制,该机制可以不通过存取方法就可以访问对象的实例变量

2.KVO(键值观察)是一种能使的对象获取到其他对象属性的通知机制。

3.实现KVO键值观察模式,被观察的对象必须使用KVC键值编码来修改它的实例变量,这样才能被观察者观察到。因此,KVC是KVO的基础或者说KVO的实现是建立在KVC的基础之上的


KVO的键值观察:

- (void)testKvo
{
    HMPerson *p = [[HMPerson alloc] init];
    p.age = 20;
   

//forKeyPath 被观察的属性 options  显示 被观察者属性改变后的 新值(NSKeyValueObservingOptionNew) 还是 旧值(NSKeyValueObservingOptionOld)

    [p addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil];
    
    p.age = 30;
    p.age = 40;
    
    self.p = p;
}

//p.age被释放是解除对该属性的观察
- (void)dealloc
{
    [self.p removeObserver:self forKeyPath:@"age"];
}
//这个方法实现如何响应变化的消息。在这个方 法里面我们可以跟自己的情况,去实现应对被观察对象属性变动的相应逻辑。

/**
 *  当监控的某个属性的值改变了就会调用
 *
 *  @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);
}

KVC的键值编码:

- (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"]); // 计算数组的长度(KVC的一些符号方法@sum,@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);
}

简单总结就是这些,希望能对初学者有一些帮助;欢迎交流!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值