KVC&KVO
2015-06-04 11:27
274 查看
一、 NSKeyValueCoding 键值编码
* 价值:
1> 可以访问私有成员变量的值
2> 可以间接修改成员变量的值(替换系统自带tabBar等等)
* 方法:
1. - valueForKeyPath:
例:
1> 调用者是对象, 即类似点语法:
2. - valueForKey:
只能取直接属性不能取间接属性
例:
1> 直接取调用者的属性
3. - setValuesForKeysWithDictionary:
例:
* 注意
KVC的setValue如果是基本数据类型,要转成NSNumber或者NSValue. 相反,返回的也是NSNuber\NSValue
二、Key Value Observing 键值监听
* 内部实现
1> 基于runtime实现的.
2> [person addObserver..];之后系统会生成一个person子类(NSKVONotifying_Xxx), 在子类的set方法中通知监听器.
* 价值:
1> 可以监听属性的变化
* 使用方法:
1. 添加监听器
2. 监听器实现监听方法
3. 不用了必须移除监听器
* 价值:
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]; }
相关文章推荐