2.KVC机制的实现

作者: LynnXYT | 来源:发表于2016-03-23 01:17 被阅读127次

    题记:Having a calm smile to face with being disdained indicates kind of confidence.——被轻蔑的时候能平静的一笑,这是一种自信。这是一种人生态度,现在的自己还很年轻,对知识的掌握还很浅显,慢慢成长吧。学习就是一个总结的过程,希望我自己可在总结中成长,也希望能够帮助到有需要的你-

    今天总结的是在OC中经常用到,提到的KVC

    1. 什么是KVC
      KVC即Key Value Coding ,就是键值编码的意思,这是一种很灵活的设置、修改和获取属性的操作,这种方式允许以字符串形式来间接操作对象的属性。
    2. 简单的KVC
      最基本的KVC由NSKeyValueCoding协议提供支持,最基本的操作属性的两种方法为:
    /* 
        * value - 属性值 key - 属性名
        */
    (void)setValue:(nullable id)value forKey:(NSString *)key;// 为指定属性设置值
    (id)valueForKey:(NSString *)key;// 获取指定属性的值
    

    这两种方法都是通过NSString对象来指定被操作属性的,forKey用于指定属性名。

    • 接下来讲讲 setValue:(nullable id)value forKey:@"name";的底层实现机制:
      (1)setName:属性值;:首先调用setName:属性值;方法,通过setter方法完成设置。
      (2)_name:如果类中没有setName:属性值;方法,KVC机制将会搜索该类中的_name的成员变量,无论这个成员变量是在类的接口部分定义,还是在类的实现文件中定义,也无论用哪个访问控制符修饰,事实上,KVC的底层实现就是对_name的成员变量赋值。
      (3)name:如果类中既没有setName:属性值;方法,也没有_name成员变量,KVC机制接下来会寻找名为name的成员变量,无论这个成员变量是在类的接口部分定义,还是在类的实现文件中定义,也无论用哪个访问控制符修饰,事实上,KVC的底层实现就是对name的成员变量赋值。
      (4)setValue:forUndefinedKey::如果上面提到的三个解决方法都没有找到,系统将会自动调用该类中的setValue:forUndefinedKey:方法。默认的setValue:forUndefinedKey:方法的实现就是引发一个异常,这个异常会导致程序终止。

    • 同理我们再来了解一下(id)valueForKey:@"name";的底层实现机制:
      (1)-(id)name;:首先调用-(id)name;方法,通过getter方法完成属性值的读取。
      (2)_name:如果类中没有-(id)name;方法,KVC机制将会搜索该类中的_name的成员变量,无论这个成员变量是在类的接口部分定义,还是在类的实现文件中定义,也无论用哪个访问控制符修饰,事实上,KVC的底层实现就是获取_name的成员变量的值。
      (3)name:如果类中既没有-(id)name;方法,也没有_name成员变量,KVC机制接下来会寻找名为name的成员变量,无论这个成员变量是在类的接口部分定义,还是在类的实现文件中定义,也无论用哪个访问控制符修饰,事实上,KVC的底层实现就是获取name的成员变量的值。
      (4)valueforUndefinedKey::如果上面提到的三个解决方法都没有找到,系统将会自动调用该类中的valueforUndefinedKey:方法。默认的valueforUndefinedKey:方法的实现就是引发一个异常,这个异常会导致程序终止。

    1. 处理不存在的key
      在程序中往往会在使用KVC时不经意犯一些低级的错误,例如:使用KVC操作属性时,这些属性或成员变量并不存在,KVC将会自动调用setValue:forUndefinedKey:方法或valueforUndefinedKey:方法,导致程序因异常而终止,此时想要处理这些不存在的属性,或想阻止程序因异常而终止时做做一些其他操作,就要重写setValue:forUndefinedKey:方法或valueforUndefinedKey:方法

    2. Key路径
      KVC除了可以操作对象的属性之外,还可以操作对象的"复合属性"。复合属性在KVC机制中将其视为Key路径,即使为对象中的对象属性赋值,实现的方法为:

    setValue:forKeyPath:;// 根据Key路径设置属性值
    valueForKeyPath:;// 根据Key路径获取属性值
    
    总结

    KVC机制的实现并不复杂,关键要记住KVC机制的底层实现策略,和对异常发生时的应对策略。

    相关文章

      网友评论

        本文标题:2.KVC机制的实现

        本文链接:https://www.haomeiwen.com/subject/yjellttx.html