一、什么是KVC?
KVC是Key Value Coding键值编码,是一种通过字符串的名字(Key)来访问类属性的一种机制。
开发者可以通过Key名直接访问对象的属性,或者给对象的属性赋值,而不需要调用明确的存取方法,这样就可以在运行的时候动态的访问和修改对象的属性,而不是在编译时确定。
二、KVC使用基本方法:
1、setValue: forKey: (通过Key来设值)
2、setValue: forKeyPath: (通过KeyPath来设值)
3、valueForKey: (直接通过Key来取值)
4、valueForKeyPath: (直接通过KeyPath来取值)
三、KVC设值方法实现:(总体规则,先找相关方法,再找相关变量)
1、先搜_setKey方法(其次搜_setIsKey)方法;
2、如果1都没有找到,就判断+(Bool)accessInstanceVariablesDirectly(是否直接访问成员变量)方法;
(2.1)如果return YES;按_key、_isKey、key、isKey的顺序搜索变量名;
(2.2)如果return NO; 直接调用-valueForUndefinedKey:(默认抛出异常);
3、如果(2.1)还是没有找到就调用-valueForUndefinedKey:;
四、KVC取值方法实现:(总体规则,先找相关方法,再找相关变量)
1.先后搜索getKey:、key、isKey三个方法,若某一个方法被实现,取到的即是方法返回的值,后面的方法不再运行。如果是BOOL或者Int等值类型, 会将其包装成一个NSNumber对象。
2、如果1都没有找到,就判断+(Bool)accessInstanceVariablesDirectly(是否直接访问成员变量)方法;
(2.1)如果return YES;按_key、_isKey、key、isKey的顺序搜索变量名;
(2.2)如果return NO; 直接调用-valueForUndefinedKey:(默认抛出异常);
3、如果(2.1)还是没有找到就调用-valueForUndefinedKey:;
五、容器类及基本数据类型KVC的情况
1、容器类:容器类有点区别,除了属性外,会调用下面这两个方法(-countOfNameArray)、(-objectInNameArrayAtIndex:),进行成员的设置;
2、基本数据类型,通过KVC获取到值之后,转换成为NSNumber类型
六、开发中使用到KVC的业务场景
1、动态取值和设值
2、访问系统私变量,或控件的内部属性
3、访问系统的隐藏方法 @max @min @sum @count
4、Model和字典转换,封装网络数据解析框架:MJExtension
5、KVO基于KVC实现
七、通过KVC修改属性会触发KVO吗?
- 可以触发,