博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS----KVC和KVO 详解
阅读量:7222 次
发布时间:2019-06-29

本文共 2145 字,大约阅读时间需要 7 分钟。

一. KVC

1.KVC介绍

    KVC 就是键值编码(key-value-coding)。

2.KVC 的主要作用:

   (1)通过键值路径为对象的属性赋值。主要是可以为私有的属性赋值。

AppleViewController *appleVC = [[AppleViewController alloc]init];    [appleVC setValue:@"橘子" forKey:@"name"];
如果对象A的属性是一个对象B,要设置对象B的属性
[person setValue:@"旺财" forKeyPath:@"dog.name"];

(2)通过键值路径获取属性的值。主要是可以通过key获得私有属性的值。

NSString *nameStr = [appleVC valueForKey:@"name"];

   也可以通过keypath获得值

NSString *dName = [person valueForKeyPath:@"dog.name"];

(3)将字典转型成Model,方法:setValuesForKeysWithDictionary:

// 定义一个字典    NSDictionary *dict = @{                           @"name"  : @"jack",                           @"money" : @"20.7",                           };    // 创建模型    Person *p = [[Person alloc] init];        // 字典转模型    [p setValuesForKeysWithDictionary:dict];    NSLog(@"person's name is the %@",p.name);

注意:字典的key和Model的属性一定要一一对应。否则会出现错误。比如person里没有name的属性,系统报错如下:

'[<Person 0x60000001d0b0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key name.'

 

二. 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
*)change context:(void *)context{ //拿到新值/旧值,进行操作 NSLog(@"newValue----%@",change[@"new"]); NSLog(@"oldValue----%@",change[@"old"]);}

  (3)取消监听

-(void)dealloc{    [person removeObserver:self forKeyPath:@"test"];}

4.KVO的使用场景

KVO用于监听对象属性的改变。

  (1)下拉刷新、下拉加载监听UIScrollView的contentoffsize;

  (2)webview混排监听contentsize;
  (3)监听模型属性实时更新UI;
  (4)监听控制器frame改变,实现抽屉效果。

 

 

转载于:https://www.cnblogs.com/huadeng/p/7064382.html

你可能感兴趣的文章
centos 7 升级后yum install出现Exiting on user cancel
查看>>
看不见的面孔:“炫技派”、“勒索派”之外,黑客有何新类型
查看>>
恢复 WordPress 4.4 被移除的“获取短链接”按钮
查看>>
有观点称 Linux 粉丝是时候对闭源软件张开双臂
查看>>
基础架构联盟:自由软件最佳实践
查看>>
《音乐达人秀:Adobe Audition实战200例》——实例10 播放卡拉OK视频,录制歌声
查看>>
《Python编程快速上手——让繁琐工作自动化》——1.6 程序剖析
查看>>
Linux中的15个‘echo’ 命令实例
查看>>
《Unreal Engine 4蓝图可视化编程》一2.2 制作瞄准镜效果
查看>>
《树莓派用户指南(第3版)》——1.5 关于Model B的PCB版本修订历史
查看>>
《WebGL入门指南》——第1章,第1.3节WebGL原生API
查看>>
《树莓派Python编程入门与实战(第2版)》——3.5 关于Python交互式shell
查看>>
《Android安全技术揭秘与防范》—第2章2.2节安全的发展趋势
查看>>
《AngularJS高级程序设计》——5.6 使用JavaScript运算符
查看>>
Storm入门之附录B
查看>>
vnStatSVG: 流量监控软件 vnStat 最佳 Web 前端
查看>>
《Python数据分析》一2.2 创建多维数组
查看>>
《C++面向对象高效编程(第2版)》——1.5 什么可以作为类
查看>>
《UML用户指南(第2版.修订版)》—第2章2.4节软件开发生命周期
查看>>
《师兄教你找工作——100场面试 20个offer背后的求职秘密》一2.5 那些老生常谈的问题...
查看>>