Object-C之KVC与KVO

【一】KVC键值编码
KVC全称Key Value Coding
KVC由NSKeyValueCoding协议支持
用来给对象中的属性进行赋值

几个重要方法:
        FKBook *book = [[FKBook alloc] init]; 
        [book setValue:@"iOS" forKey:@"name"]; // 赋值
        NSString name = [book valueForKey:@"name"]; // 获取值

        // 下面三个方法都是防止异常情况发生
        // 处理未定义的key
        - (void)setValue:(id)value forUndefinedKey:(NSString *)key { 
        }

        - (id)valueForUndefinedKey:(NSString *)key {

            return key;
        }

        // 处理nil
        - (void)setNilValueForKey:(NSString *)key {
        }


        // key路径问题
        // 其中item是对象,name是item对象中的属性
        [book setValue:@"iOS" forKeyPath:@"item.name"];
        [book valueForKey:@"item.name"];

        // 利用字典给对象赋值
         [book setValuesForKeysWithDictionary:@{@"name":@"iOS"}];
KVC键值编码的原理
1.会先找name属性的setter和getter方法进行赋值或者获取值
2.如果没找到会寻找_name
3.如果没找到会寻找name
3.如果都没找到,会执行valueForUndefinedKey方法

【二】KVO键值监听
KVO全称Key Value Observing
由NSKeyValueObserving协议支持
用来解决模型中数据发生改变通知视图组件刷新问题

几个重要的方法:
    // 增加监听器
    - (void)setItem:(FKItem *)item
    {
        // self.item = item; 运用self.item赋值,会默认调用item的set方法,会造成循环调用错误
        self->_item = item;
        // 或者 _item = item;
        [self.item addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:@"hello world"];
        [self.item addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionNew context:nil];
    }

    // 模型中数据发生改变时,调用此方法
    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context {
        NSLog(@"keyPath = %@", keyPath);
        NSLog(@"object = %@", object);
        NSLog(@"change = %@", change);
        NSLog(@"context = %@", context);

        }

    // 当页面销毁时移除监听器
    - (void)dealloc
    {
        [self.item removeObserver:self forKeyPath:@"name" context:@"hello world"];
        [self.item removeObserver:self forKeyPath:@"age"];
    }

KVO只有调用的setter和getter方法,才会触发
KVO和iOS的消息中心(NSNotificationCenter)有些相似
NSNotificationCenter由消息中心统一发送通知,不限于监听属性的变化,使用比KVO更加灵活

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值