基础三:KVC的理解

一、定义

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机制,对类中私有的属性访问和修改。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • KVC(Key-value coding)键值编码,单看这个名字可能不太好理解。其实翻译一下就很简单了,就是指iO...
    我的梦工厂阅读 4,379评论 1 8
  • KVC(Key-valuecoding)键值编码,单看这个名字可能不太好理解。其实翻译一下就很简单了,就是指iOS...
    榕樹頭阅读 4,014评论 0 2
  • KVC KVC(Key-Value-Coding)是Cocoa框架为我们提供的非常强大的工具,简译为键值编码。iO...
    Longshihua阅读 3,060评论 0 6
  • KVC简单介绍 KVC(Key-value coding)键值编码,就是指iOS的开发中,可以允许开发者通过Key...
    公子无礼阅读 5,300评论 0 6
  • 本文参考: KVC官方文档 KVC原理剖析 iOS KVC详解 KVC 简介 KVC全称是Key Value Co...
    拧发条鸟xds阅读 10,699评论 6 23

友情链接更多精彩内容