还长时间 没来了 今天分享一下 个人总结的 KCO KVC 笔记:
(如有错误,请速速联系我 愿听你的建议!)
KVO 与 KVC 区别:
- KVO 主要用于监听属性属性改变
- KVC 主要用于对某一对象的成员变量赋值
KVO:
运用KVO 监听成员属性 时 想要监听哪个 就对哪个属性监听
// KVO
监听属性改变
[item addObserver:self
forKeyPath:@"one" options:0
context:nil];
[item addObserver:self
forKeyPath:@"Two" options:0
context:nil];
[item addObserver:self
forKeyPath:@"Three" options:0
context:nil];
[item addObserver:self
forKeyPath:@"Four" options:0
context:nil];
既然监听了 就必须实现系统的监听方法:
(在这个方法中设置一些属性值)
/**
* 监听到某个对象的属性改变了,就会调用
*
* @param keyPath 属性名
* @param object 哪个对象的属性被改变
* @param change 属性发生的改变
*/
-
(void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
既然对 属性进行监听 那就要在对象销毁时 对其中的属性移除监听
比如:
-
(void)dealloc
{
[self.item removeObserver:self forKeyPath:@"badgeValue"];
[self.item removeObserver:self forKeyPath:@"title”];
}
KVC:
我们一般是通过调用set方法或属性的点语法来直接更改对象的状态,即对象的属性值,比如[stu
setAge:10]; stu.age = 9;
KVC,它是一种间接更改对象状态的方式,其实现方法是使用字符串来描述对象需要更改的属性。KVC中的基本调用包括valueForKey:和setValue:ForKey:,以
字符串的形式向对象发送消息
这里以Student和Card为例子
1.使用setValue:ForKey:设置Student对象的name
[student setValue:@"one" forKey:@"name"];
使用setValue:ForKey:设置Student对象的age
[student setValue:[NSNumber numberWithInt:17]
forKey:@"age"];
在设置一个标量值时,需要先将标量值包装成一个NSNumber或NSValue对象
2.KVC可以对对象进行批量更改
例如,同时获取Student的age和name
NSArray *keys = [NSArray arrayWithObjects:@"name", @"age", nil];
NSDictionary *dict = [student dictionaryWithValuesForKeys:keys];
3. 同时设置Student的age和name
NSArray *keys = [NSArray arrayWithObjects:@"name", @"age", nil];
NSArray *values = [NSArray arrayWithObjects:@"One", [NSNumber
numberWithInt:16], nil];
NSDictionary *dict = [NSDictionary dictionaryWithObjects:values
forKeys:keys];
[student setValuesForKeysWithDictionary:dict];