1,KVC(键值编码)  Key Value Coding

  1.1在C#中,可以通过字符串反射来获取对象,从而对对象的属性进行读写,Object-C中有同样的实现,通过字符串(属性名词)对对象的属性进行读写。

  1.2KVC的操作方法由NSKeyValueCoding协议来定义,而Object对象实现该协议,所以所有的对象都具有KVC功能

    动态设置:setValue:属性值 forKey:属性名    setValue: 属性值forKeyPath:属性路径

    动态读取:valueForKey:属性名  valueForKeyPath:属性路径

  名词解释:属性名(简单路径)  属性路径(复合路径,比如A对象有一个b属性,那么A.b就是复合属性)

  1.3KVC动态设置规则:(假设对a进行设置)首先查找setA方法,如果没有setA方,则查找_a变量,如果没有_a变量,则查找a变量,如果没有a变量,则调用 setValue: forUndefinedKey:方法。对于方法和属性,不管公有还是私有都可以设置成功

  1.4KVC动态读取规则:(假设对a进行读取)首先读取a方法,如果没有a方法,则查找_a变量,如果没有_a变量,则查找a变量,如果没有a变量,则调用valueForUndefinedKey:方法。对于方法和属性,不管公有还是私有都可以设置成功

  1.5 KVC 与 对象的读写方法有什么区别

    1,可以通过属性的名字直接访问属性,而不是调用的属性的accssor。

    2,减少代码量

  for example:场景一:

    People *people = [peoleArray objectAtIndex:row];

    if ([[column identifier] isEqualToString:@"name"]) {

      return [people name];

       }

    if ([[column identifier] isEqualToString:@"age"]) {

      return [people age];

       }

    利用KVC :  return [people valueForKey:[colum identifier]];

  场景二:可以把一个NSDictionary 的元素直接赋值给对象的属性。

    -(id) initWithDictionary:(NSMutableDictionary*) jsonObject

    {

      if((self = [super init]))

        {

           [self init];

      [self setValuesForKeysWithDictionary:jsonObject];

       }

      return self;

    }

    setValuesForKeysWithDictionary:  把NSDictionary中key对应的对象属性设置上NSDictionary中key对应的value.

    异常处理:(1)如果NSDictionary中key 与对象中属性的名称不一致时,我们需要 setValue: forUndefinedKey: 方法来处理没有匹配上的属性,否则setValuesForKeysWithDictionary:将抛出异常(NSUndefinedKeyException)

         (2)如果NSDictionay 内嵌的结构比较复杂:Products{product1{count:xx, sumPrice:xx}}, product2{} ….},我们需要重写 setValue: forKey: 方法。

    1.   -(void) setValue:(id)value forKey:(NSString *)key
    2.   {
    3.     if([key isEqualToString:@"products"])
    4.     {
    5.       for(NSMutableDictionary *productDict in value)
    6.       {
    7.         Prodcut *product = [[Product alloc] initWithDictionary:prodcutDict];
    8.         [self.products addObject:product];
    9.       }
    10.     }
    11.   }

  场景三: 我们需要把数组里People对象的name名字的首字母大写,调用kvc:

       return  [array  valueForKeyPath:@"name.capitalizedString"]  (这里是valueForKeyPath)

  1.6 KVC集合运算符 

    插入一个知识点:NSNumber 封装的数据类型有 Char,UnsignedChar, Short, UnsignedShort, Int, UnsignedInt, Long, UnsignedLong,  LongLong, UnsignedLongLong, Float, Double, Bool, Integer, UnsingedInteger.

            NSValue 封装的数据类型:CGPoint, CGSize, CGRect, CGAffineTransform, UIEdgeInsets, UIOffset.

  集合运算符是一组特殊的key path,只能传递给 valueForKeyPath: 该方法。

  集合运算符的格式:

      

  共支持5种运算:@sum @avg @count @max @min  

2,KVO(键值监听)  Key Value Observing (观察者模式)

  2.1KVO的操作方法由NSKeyValueObserving协议来指定,NSObject对象实现了该协议,所以所有的对象都拥有KVO操作。

  2.2KVO操作的方法如下:

    注册指定key路径的监听器: addObserver: forKeyPath: options: context:

    删除指定key路径的监听器:removeObserver: forKeyPath:、 removeObserver: forKeyPath: context:

    监听器回调方法:  observeValueForKeyPath: ofObject: change: contenxt:

   options的值说明:

    NSKeyVlaueObservingOptionNew

    需要补充。。。。。。。

    change:  参数为NSDictionary , key 为 new 和 old

  2.3KVO 与NSNotificationCenter的区别

    好处:1,代码更简洁,不需要修改被观察的类,永远都是观察者在做事情

    不足:1,如果没有observer 监听 keyPath, removeOberser: forKeyPath: 会crash。

       2,很难定位是谁监听了对象的属性

  2.4 KVO的自动触发与手动触发

    自动触发原理:键值观察通知依赖于NSObject的两个方法:willChangeValueForKey: 和 didChangeVlaueForKey:。在一个被观察属性发生改变之前,调用willChangeValueForKey,改变之后调用didChangeVlaueForKey,然后调用 observerValueForKey: ofObject: change: context:.

   模拟一个被观察属性发生改变场景:

  - (void)setNow:(NSDate *)aDate {
      [self willChangeValueForKey:@"now"]; // 运行时,自动添加方法
      _now = aDate;  
      [self didChangeValueForKey:@"now"];// 运行时,自动添加方法
  }

  实现原理, isa-Swizzing.

    原理解释: 当我们监听一个对象时,一个新类会被创建,新类继承自原来对象的类,并重写了被观察属性的setter方法,(运行时,加入了自动触发属性变更的通知),最后通过isa-Swizzing,把这个对象的isa指针,指向新创建的子类。

  

     该图来自(ios程序猿)

Objective-C之KVC、KVO的更多相关文章

  1. KVC/KVO原理详解及编程指南

    一.简介 1.KVC简介 2.KVO简介 二.KVC相关技术 1.Key和Key Path 2.点语法和KVC 3.一对多关系(To-Many)中的集合访问器方法 4.键值验证(Key-Value V ...

  2. 【转】 KVC/KVO原理详解及编程指南

    原文地址:http://blog.csdn.net/wzzvictory/article/details/9674431 前言: 1.本文基本不讲KVC/KVO的用法,只结合网上的资料说说对这种技术的 ...

  3. kvc/kvo复习

    kvc/kvo复习 1 小问题 '[<XMGPerson 0x7fb8a8f30220> setValue:forUndefinedKey:]: this XMGPerson * pers ...

  4. 转:KVC/KVO原理详解及编程指南

      作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/9674431 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或 ...

  5. 阶段性总结⓵触摸事件&手势识别⓶Quartz2D绘图⓷CALayer图层⓸CAAnimation⓹UIDynamic UI动力学⓺KVC&KVO

    知识点复习   1. 触摸事件&手势识别   1> 4个触摸事件,针对视图的 2> 6个手势识别(除了用代码添加,也可以用Storyboard添加)   附加在某一个特定视图上的, ...

  6. IOS开发之KVC KVO KVB

    KVC(Key Value Coding) KVO(Key Value Observing) KVB(Key Value Binding) KVO是Cocoa的一个重要机制,他提供了观察某一属性变化的 ...

  7. 【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态

    一. Objective-C 方法详解 1. 方法属性 (1) OC 方法传参机制 Object-C 方法传参机制 : OC 中得参数传递都是值传递, 传入参数的是参数的副本; -- 基本类型 (值传 ...

  8. KVC & KVO

    KVC和KVO看上去又是两个挺牛的单词简写,KVC是Key-Value Coding的简写,是键值编码的意思.KVO是Key-Value  Observing的简写,是键值观察的意思.那么我们能拿KV ...

  9. KVC&&&KVO

    KVC 什么是KVC --->What KVC指的就是NSKeyValueCoding非正式协议. KVC是一种间接地访问对象的属性的机制. 这种间接表现在通过字符串来标识属性,而不是通过调用存 ...

  10. 04 KVC|KVO|Delegate|NSNotification区别

    一. iOS 中KVC.KVO.NSNotification.delegate 在实际的编程中运用的非常多,掌握好他们的运行原理和使用场合对于我们程序的开发将会带来事办工倍的效果:   二. KVC ...

随机推荐

  1. 40个Java多线程问题总结

    前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行 ...

  2. ASP.NET MVC Model绑定(一)

    ASP.NET MVC Model绑定(一) 前言 ModelMetadata系列的结束了,从本篇开始就进入Model绑定部分了,这个系列阅读过后你会对Model绑定有个比较清楚的了解, 本篇对于Mo ...

  3. [Mahout] 完整部署过程

    概述        Mahout底层依赖Hadoop,部署Mahout过程中最困难的就是Hadoop的部署      本文假设用户本身没有进行Hadoop的部署,记述部署Mahout的过程       ...

  4. [NodeJS] Hello World 起步教程

    概述: 做数据,免不了需要展示数据,数据可视化是必须经历的步骤. 本文将提供一个NodeJS的起步教程,是笔者这两天探索的小结. 正文:  1. 为什么使用NodeJS 究竟是以B/S还是C/S的架构 ...

  5. HTML5 & CSS3初学者指南(2) – 样式化第一个网页

    介绍 我们已经使用基本的 HTML 编写了一个网页.但是,写出来的 HTML 代码的网页看起来很平淡,没有吸引力. 如何改善这种很平淡的页面呢? 让我们开始使用网页的基本样式来改善页面效果,我们将会使 ...

  6. 如何隐藏DIV对象

    DIV对象在网页里面,相当于一个容器,在其内部,可以显示文字.图片.视频控件等等. 以下的教程,和大家一起来学习,如何隐藏DIV对象. 这必须使用CSS来控制,才能达到隐藏的目的,那么,就得使用CSS ...

  7. Eclipse 使用技巧

    1.Eclipse 格式化代码时不换行与自动换行 Eclipse 推荐的编码风格默认是80列换行.每次用Eclipse自带的Ctrl+shift+f格式化代码时,如果原来的一行代码大于80列,Ecli ...

  8. JS作用域面试题总结

    关于JS作用域问题,是面试的时候面试官乐此不疲的面试题,有时候确实是令人抓狂,今天看到一个讲解这个问题的视频,明白了那些所谓的“原理”顿时有种豁然开朗的感觉~~~ 1.js作用域(全局变量,局部变量) ...

  9. 如何直接在 PC 端获取其它端设备的 UserAgent 信息呢?

    如何直接在 PC 端获取其它端设备的 UserAgent 信息呢 [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5909615.html 序 希望收 ...

  10. ASP.Net中实现上传过程中将文本文件转换成PDF的方法

    iTextSharp是一个常用的PDF库,我们可以使用它来创建.修改PDF文件或对PDF文件进行一些其他额外的操作.本文讲述了如何在上传过程中将文本文件转换成PDF的方法. 基本工作 在开始之前,我们 ...