您的位置:首页 > 其它

KVC&KVO

2015-06-04 11:27 274 查看
一、 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];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  KVC KVO