KVC 概念
KVC(Key-value coding)键值编码,就是指iOS的开发中,可以允许开发者通过Key名直接访问对象的属性,或者给对象的属性赋值。而不需要调用明确的存取方法。这样就可以在运行时动态地访问和修改对象的属性。而不是在编译时确定,这也是iOS开发中的黑魔法之一。很多高级的iOS开发技巧都是基于KVC实现的。
它是一种可以通过字符串的名字(key)来访问类属性的机制。而不是通过调用Setter、Getter方法访问。
关键方法定义在 NSKeyValueCodingProtocol
KVC支持类对象和内建基本数据类型。
搜索方式
setValue检索方式
1、首先搜索setKey:方法。(key指成员变量名,首字母大写)没找到找_setKey之后是setIsKey
2、上面的setter方法没找到,如果类方法accessInstanceVariablesDirectly返回YES。那么按 _key,_isKey,key,iskey的顺序搜索成员名。(NSKeyValueCodingCatogery中实现的类方法,默认实现为返回YES)
3、如果没有找到成员变量,调用setValue:forUnderfinedKey:
valueForKey检索方式
1.1按先后顺序搜索getKey,key,iskey,_key方法,若某一个方法被实现,取到的即是方法返回的值,后面的方法不再运行。如果是BOOL或者Int等值类型, 会将其包装成一个NSNumber对象。
2.若这三个方法都没有找到,则会调用+ (BOOL)accessInstanceVariablesDirectly方法判断是否允许取成员变量的值。若返回NO,直接调用valueForUndefinedKey:,默认是奔溃。若返回YES,会按先后顺序取_key、_isKey、 key、isKey的值。
3.返回YES时,_key、_isKey、 key、isKey的值都没取到,调用- valueForUndefinedKey:方法。