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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值