• IOS之KVC全解


     

    一  KVC的基本概念
     KVC是Key Value Coding的缩写,意思是键值编码。  

    在iOS中,提供了一种方法通过使用属性的名称(也就是Key)来间接访问对象属性的方法,这个方法可以不通过getter/setter方法来访问对象的属性。

    用KVC可以间接访问对象属性的机制。通常我们使用valueForKey 来替代getter 方法,setValue:forKey来代替setter方法。

    —————————————————————————————————————————————————————————————

    二  常用方法及特性

    1)KVC的常用方法
    - (id)valueForKey:(NSString *)key;  ------根据key的值读取对象的属性

    - (void)setValue:(id)value forKey:(NSString *)key;  ------根据key的值来写对象的属性
     
    setNilValueForKey: 当对非类对象属性设置nil时,调用,默认抛出异常。
     
    valueForUndefinedKey:------错误拦截,当key的值是没有定义的,这个方法会被调用,如果你自己写了这个方法,key的值出错就会调用到这里来

    KVC 最常用的还是在序列化和反序列话对象。尤其是在json 转模型的时候,KVC让程序员摆脱了繁琐无营养的代码堆积。减少代码量就是减少出错的概率

    2)
    使用 KVC 为对象赋值或者取值时,需要知道准确的键值, 相比较点语法,KVC 是一种间接的传递方式,这种方式有利于
              对象解耦,让对象彼此之间的耦合度不会太高。

    KVC 不但能够赋值,而且还能破坏只读的特性。OC中的KVC操作就和Java中使用反射机制去访问类的private权限的变量,很暴力,这样做就会破坏类的封装性. 类的私有属性和只读属性都可以通过KVC去访问.

    当然这只是我们需要注意的一个细节,更重要的是KVC 有自动装箱(自动类型转换)的功能,我们不需要去转换类型了。

    3)、支持键值路径
    什么叫支持键值路径?键值路径是对于一个类中有数组对象的属性进行便捷操作
    说白了就是支持嵌套。因为类key反复嵌套,所以有个keyPath的概念,keyPath就是用.号来把一个一个key链接起来,这样就可以根据这个路径访问下去(KVC在按照键值路径取值时,会自动层层深入,获取对应的键值)

    4)支持操作符
    假如我们有10个字符串,我们想求出这10个字符串的总长度,我们可以使用KVC提供的操作符。

    NSArray *books=@[@"鸟哥烧烤私房菜",@"程序员摊煎饼宝典",@"麻辣烫基础教程"];
    NSLog(@"%@",[books valueForKeyPath:@"@sum.length"]);
    这里的@sum 是KVC 提供的,不是我们写的。像这样的函数共有5个@avg,@count,@max,@min,@sum。我们直接用就可以了


    5)KVC的缺点:
    一旦使用 KVC 你的编译器无法检查出错误,即不会对设置的键、键路径进行错误检查,且执行效率要低于合成存取器方法和自定的 setter 和 getter 方法。因为使用 KVC 键值编码,它必须先解析字符串,然后在设置或者访问对象的实例变量。所以只有当你非常需要它提供的可扩展性时才使用它。
    —————————————————————————————————————————————————————————————
    三  KVC机制通过key找到value的原理
    • 当通过KVC调用对象时,比如:[self valueForKey:@”someKey”]时,程序会自动试图通过下面几种不同的方式解析这个调用。

    • 首 先查找对象是否带有 someKey 这个方法,如果没找到,会继续查找对象是否带有someKey这个实例变量(iVar),如果还没有找到,程序会继续试图调用 -(id) valueForUndefinedKey:这个方法。如果这个方法还是没有被实现的话,程序会抛出一个NSUndefinedKeyException 异常错误。

    • 补充:KVC查找方法的时候,不仅仅会查找someKey这个方法,还会查找getsomeKey这个方 法, 前面加一个get,或者_someKey以_getsomeKey这几种形式。同时,查找实例变量的时候也会不仅仅查找someKey这个变量,也会查找 _someKey这个变量是否存在。

    • 设计valueForUndefinedKey:方法的主要目的是当你使用-(id)valueForKey方法从对象中请求值时,对象能够在错误发生前,有最后的机会响应这个请求。

  • 相关阅读:
    LeetCode --- 字符串系列 --- 解码字母到整数映射
    LeetCode --- 字符串系列 --- 上升下降字符串
    LeetCode --- 字符串系列 --- 机器人能否返回原点
    集合 Set
    LeetCode --- 字符串系列 --- 唯一摩尔斯密码词
    LeetCode --- 字符串系列 --- 转换成小写字母
    LeetCode --- 字符串系列 --- 分割平衡字符串
    LeetCode --- 字符串系列 --- IP 地址无效化
    LeetCode --- 字符串系列 --- 左旋转字符串
    Revit二次开发八 事务标签值
  • 原文地址:https://www.cnblogs.com/1224dashen/p/5423036.html
Copyright © 2020-2023  润新知