KVC&KVO

一、 NSKeyValueCoding 键值编码


* 价值:
 1> 可以访问私有成员变量的值
 2> 可以间接修改成员变量的值(替换系统自带tabBar等等)

* 方法:
1. - valueForKeyPath:

例:
 1> 调用者是对象, 即类似点语法:
    [group valueForKeyPath:@"title"];   <-->   group.title;
 2> 调用者是数组, 即把数组中的每个元素的key对应的value拼装成一个数组返回
    [_groups valueForKeyPath:@"title"];     // 类似遍历
 3> Person *p;     //假设有个人, 拥有一本书book, 书有属性name
    [p valueForKeyPath: @"book.name"];

2. - valueForKey:
只能取直接属性不能取间接属性
例:
 1> 直接取调用者的属性
    [group valueForKey:@"title"];     // 对, 对象group中有属性title
    [_groups valueForKey:@"title"];     // 错, 数组groups没有属性title

 3. - setValuesForKeysWithDictionary:
例:
    [car setValuesForKeysWithDictionary:dict];    <-->   car.icon = dict[@"icon"];
                                                         car.name = dict[@"name"];
                                                         ...
        (模型的属性要和字典的Key一样) 

* 注意
 KVC的setValue如果是基本数据类型,要转成NSNumber或者NSValue. 相反,返回的也是NSNuber\NSValue



二、Key Value Observing 键值监听


* 内部实现
 1> 基于runtime实现的.
 2> [person addObserver..];之后系统会生成一个person子类(NSKVONotifying_Xxx), 在子类的set方法中通知监听器.

* 价值:
 1> 可以监听属性的变化

* 使用方法:
1. 添加监听器
    [self.person addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionOld context:nil];

2. 监听器实现监听方法
    - (void)observeValueForKeyPath:ofObject:change:context;

3. 不用了必须移除监听器
    - (void)dealloc {
        [self removeObserver:forKeyPath];
    }


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值