KVC实现原理及开发中使用场景

一、什么是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实现原理及开发中使用场景)