题记:Having a calm smile to face with being disdained indicates kind of confidence.——被轻蔑的时候能平静的一笑,这是一种自信。这是一种人生态度,现在的自己还很年轻,对知识的掌握还很浅显,慢慢成长吧。学习就是一个总结的过程,希望我自己可在总结中成长,也希望能够帮助到有需要的你-
今天总结的是在OC中经常用到,提到的KVC
- 什么是KVC
KVC即Key Value Coding ,就是键值编码的意思,这是一种很灵活的设置、修改和获取属性的操作,这种方式允许以字符串形式来间接操作对象的属性。 - 简单的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:
方法的实现就是引发一个异常,这个异常会导致程序终止。
-
处理不存在的key
在程序中往往会在使用KVC时不经意犯一些低级的错误,例如:使用KVC操作属性时,这些属性或成员变量并不存在,KVC将会自动调用setValue:forUndefinedKey:
方法或valueforUndefinedKey:
方法,导致程序因异常而终止,此时想要处理这些不存在的属性,或想阻止程序因异常而终止时做做一些其他操作,就要重写setValue:forUndefinedKey:
方法或valueforUndefinedKey:
方法 -
Key路径
KVC除了可以操作对象的属性之外,还可以操作对象的"复合属性"。复合属性在KVC机制中将其视为Key路径,即使为对象中的对象属性赋值,实现的方法为:
setValue:forKeyPath:;// 根据Key路径设置属性值
valueForKeyPath:;// 根据Key路径获取属性值
总结
KVC机制的实现并不复杂,关键要记住KVC机制的底层实现策略,和对异常发生时的应对策略。
网友评论