iOS开发-OC篇-KVC详解
说到KVC,不得不承认KVC在开发过程中是神器一般的存在。如果正确灵活使用kvc,会使得整个开发过程轻松很多。
KVC的使用
1、KVC 全称 key valued coding 键值编码
反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性.JAVA,C#都有这个机制。ObjC也有,所以你根部不必进行任何操作就可以进行属性的动态读写,就是KVC。
KVC的操作方法由NSKeyValueCoding提供,而他是NSObject的类别,也就是说ObjC中几乎所有的对象都支持KVC操作。
2、常用方法
获取值的方法
valueForKey:,传入NSString属性的名字。
valueForKeyPath:,传入NSString属性的路径,xx.xx形式。
valueForUndefinedKey它的默认实现是抛出异常,可以重写这个函数做错误处理。
修改值的方法
setValue:forKey:
setValue:forKeyPath:
setValue:forUndefinedKey:
setValue:forKey的搜索过程:
1. 首先搜索set<Key>:方法
如果成员用@property,@synthsize处理,因为@synthsize告诉编译器自动生成set<Key>:格式的setter方法,所以这种情况下会直接搜索到。
注意:这里的<Key>是指成员名,而且首字母大写。
2. 上面的setter方法没有找到,如果类方法accessInstanceVariablesDirectly返回YES(注:这是NSKeyValueCodingCatogery中实现的类方法,默认实现为返回YES)。
那么按_<key>,_is<Key>,<key>,is<key>的顺序搜索成员名。
3. 如果还是没有找到设置成员的值,就会调用setValue:forUndefinedKey:。
4. 如果没有重写setValue:forUndefinedKey程序会马上崩溃。
注意:
1、使用KVC间接修改对象属性时,系统会自动判断对象属性的类型,并完成转换。.
2、KVC可以访问成员变量,无论是否提供getter/setter方法,无论可见性是怎样,是否有readonly修饰。
setValue:forUndefinedKey与valueForUndefinedKey的应用
KVC的主要用途无非是ORM映射,就是将dictionary转换成model,但有些服务器返回的字段有可能是oc的关键字比如‘id’,’description’等。如上代码举得id的例子,我们无法让@property后面key值为id,于是使用大写的ID代替,KVC是区分大小写的我们不用担心。这时我们只需在setValue:forUndefinedKey把id的key值赋值给ID的key值,就可以避免关键字的尴尬。
3、dict <->model 互转
字典转模型
[self setValuesForKeysWithDictionary:dict];
模型转字典
[p dictionaryWithValuesForKeys:array];
4、KVC集合
NSArray/NSSet等都支持KVC
[array valueForKeyPath:@"dog.name"];
5、使用KVC计算属性
格式为:[p valueForKeyPath:@"Left keypath部分.@Collectionoperator部分.Right keypath部分”];
Left keypath部分:需要操作对象路径。
Collectionoperator部分:通过@符号确定使用的集合操作。
Right keypath部分:需要进行集合操作的属性。
举例:[p valueForKeyPath:@"books.@sum.price"];
@avg:平均值
@count:总数
@max:最大
@min:最小
@sum:总数
转载于:https://www.cnblogs.com/Horkly/p/5331228.html
- 点赞
- 收藏
- 分享
- 文章举报
- iOS开发 ☞ KVC详解
- ios开发UI篇—KVC简单介绍
- iOS开发——动画编程OC篇&(五)动画组
- IOS开发之属性详解
- 【iOS开发必收藏】详解iOS应用程序内使用IAP/StoreKit付费、沙盒(SandBox)测试、创建测试账号流程!2012-6-25日更新iap恢复
- iOS 开发 Certificate和Code Signing--证书与签名--详解
- iOS开发 cocopods使用详解
- iOS开发之表视图详解
- IOS 开发 网络详解(六)--- AF3.0基本API
- 【转】iOS开发——加载、滑动翻阅大量图片解决方案详解
- IOS 开发 网络详解(十三) URLSesstion详解
- 【转】IOS 开发环境,证书和授权文件等详解
- iOS开发笔记>> kvc的keypath中集合运算符怎么使用?
- 【iOS开发必收藏】详解iOS应用程序内使用IAP/StoreKit付费、沙盒(SandBox)测试、创建测试账号流程!【2012-12-11日更新获取"产品付费数量等于0的问题"】
- IOS开发UI篇—gesture详解(一)
- iOS开发——使用Charles进行http网络抓包详解
- 【IOS 开发】Object - C 入门 之 数据类型详解
- iOS 开发 公司开发者账号,在多台Mac上合作开发,共用一个账号和证书--图文详解
- iOS 开发 多线程详解之NSThread异步线程下载网络图片
- 【iOS开发必收藏】详解iOS应用程序内使用IAP/StoreKit付费、沙盒(SandBox)测试、创建测试账号流程!【2012-12-11日更新获取"产品付费数量等于0的问题"】