一、定义
KVC(key value coding)是通过key或路径在运行时(runtime)动态的直接操作(读/写)对象的属性或实例变量,与存取方法的编译时调用不同,是iOS动态特性的黑魔法之一。KVC需要由类别(Category) NSKeyValueCoding来支持。KVC兼容nil,无论key还是value都可以为nil,不会引起程序的崩溃,但非nil的key必须是合法的。
二、应用场景
1、需要向系统或是已有模块注入代码模块时,比如核心动画的注册、xib元素与代码的关联。
2、在做系统架构时,对于需要动态地或是在不定场景中嵌入代码块进入框架时;
3、对类的私有属性或实例变量进行操作(访问/修改)。(注:还有另一种解决方案就是使用runtime机制)
三、底层原理探析
1、用不明确的方法对属性进行 存取操作
valueForKey:
1、总体规则:先找相关方法,如果找不到,则判断accessInstanceVariablesDirectly(在NSKeyValueCoding.h文件中的属性)的值,默认是YES,再找相关变量,如果设置为NO(可以用来防止外部访问及操作),则系统会抛出异常,执行KVC的valueForUndefinedKey,导致程序crash,解决方案是重写该方法。
2、相关方法:get<Key>, <key>
3、容器方法:
(1)、数组(NSArray):countOf<Key>和objectIn<Key>AtIndex;
(2)、集合(NSSet)
accessInstanceVariablesDirectly YES
4、相关变量:_<key>, _is<Key>, key, is<Key>
5、将基本类型转换成NSNumber;
6、隐藏方法:count、max、min、 sum、avg,使用的时候需要使用@,如:@count;
四、总结
在完全不知某个类的属性或成员变量,可以使用runtime中的C方法获取,class_copyPropertyList, property_getName, class_copyIvarList, ivar_getName,然后再结合KVC机制,对类中私有的属性访问和修改。