KVC 与KVO 简介 与 作用 用法

一、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 是用来获取和改变属性值的;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值