一、KVC
1.什么是KVC
KVC (key-value-coding):键值编码。
2.KVC的作用
(1)为对象赋值 (或者获取值valueForkey:)
Animus *anim = [Animus new];
[anim setValue:@"六六" forkey:@"name"];
为私有属性赋值 ( 例 :改变UITextfield的placeholder 颜色 和 字体大小)
[self.textField setValue:[UIColor redColor] forKey:@"_placeholderLabel.TextColor"];
[self.textField setValue:[UIFont systemFontOfSize:13 weight:UIFontWeightMedium] forKeyPath:@"_placeholderLabel.Font"];
如果对象(Animus)中的属性是另一个对象(Cat)
[anim setValue:@"小曹" forkeyPath:@"cat.name"];
(2)使用setValuesForKeysWithDictionary:将字典转换成模型
//自定义字典 或 网络json数据中的字典
NSDictionary *dic = @{@"key" : @"value"};
//转换
[anim setValuesForKeysWithDictionary:dic];
特别提醒:字典的key和模型的属性一定要一一对应。否则程序会报错(闪退)。比如anim里没有eat的属性.系统报错为:找不到对应的key
二、KVO
1.什么是KVO
KVO 是键值观察者(key-value-observing)。KVO提供了一种观察者的机制,通过对某个对象的某个属性添加观察者,当该属性改变,就会调用"observeValueForKeyPath:"方法,为我们提供一个“对象值改变了!”的时机进行一些操作。
2.KVO实现原理
当某个类的对象第一次被观察时,系统在运行时会创建该类的派生类,改派生类中重写了该对象的setter方法,并且在setter方法中实现了通知的机制。派生类重写了class方法,以“欺骗”外部调用者他就是原先那个类。系统将这个类的isa指针指向新的派生类,因此改对象也就是新的派生类的对象了。因而改对象调用setter就会调用重写的setter,从而激活键值通知机制。此外派生类还重写了delloc方法来释放资源。
3.KVO的使用
(1)给对象的属性添加观察者
[appleVC addObserver:self forKeyPath:@"name" options: NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];
注: options: NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld 返回改变之后的值 和 未改变之前的值 context可以为空
(2)若该属性发生改变,系统自动调用下面的方法:
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
//拿到新值/旧值,进行操作
NSLog(@"newValue----%@",change[@"new"]);
NSLog(@"oldValue----%@",change[@"old"]);
}
(3)取消监听
-(void)delloc{
[anim removeObserver:self forKeyPath:@"test"];
}
4.KVO的使用场景
KVO用于监听对象属性的改变。
(1)下拉刷新、下拉加载监听UIScrollView的contentoffsize;
(2)webview混排监听contentsize;
(3)监听模型属性实时更新UI;
(4)监听控制器frame改变,实现抽屉效果
5.区别
如果仔细看过我上面写的内容那么KVO和KVC的区别就出来了。
KVO 是用来观察属性变化的;
KVC 是用来获取和改变属性值的;