A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Simpon 中级黑马   /  2016-5-10 15:15  /  2051 人查看  /  4 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Simpon 于 2016-10-27 10:29 编辑


版权声明:本文为作者原创文章,未经作者允许不得转载。

KVC疑问解密

       疑问解密1
使用KVC是直接对成员变量赋值,还是调用了这个成员变量对应的setter和getter方法呢?
为了解决这个疑问,我们给HMPerson类里加一个私有的成员变量name,并且给它写好对应的getter和setter方法,如图:


然后用KVC的方式给name赋值和取值,如图:


通过观察,我们发现用KVC来赋值时,对应的setter方法能被调用,用KVC来取值时,对应的getter方法也能被调用。
因此小伙伴们不用担心KVC会破坏自己已经写好的属性封装规则。
疑问解密1小分支:
如果没有getter方法和setter方法时,KVC是怎么找成员变量的呢?
为了弄清这个问题,我们删掉name的getter和setter方法。如图:


然后通过KVC方式赋值取值,会发现,依然可以赋值和取值成功。并且是给p对象的成员变量_name赋值的。如图:



小伙伴们可能好奇的是,传入的Key是“name”,而赋值成功的是“_name”成员变量,那么如果,我同时有两个成员变量,一个叫“_name”,一个叫“name”,那KVC是给谁赋值的呢?
为了搞清这个问题,我们先改良一下HMPerson类。


然后,我们再次用KVC来调用,并且下一个断点看看,究竟是给哪个成员变量赋值的。如图:


通过结果,我们发现,依然是对“_name”这个成员变量赋值的。这时候我们是否可以说,KVC永远是对带下划线的成员变量赋值的呢?那倒也未必,我们来继续看,假如此时给HMPerson删掉“_name”,只留“name”,又会是怎样。
如图:



此时发现,用KVC赋值的就是这个不带下划线的成员变量(即name)了。

因此,我们可以总结出,KVC赋值和取值的一套顺序:
1.    用KVC取值或赋值时,会优先找这个属性对应的getter或setter方法来对这个属性赋值
2.    如果找不到,则会查找带下划线的属性,如果找到则赋值
3.    如果依然找不到,则会查找不带下划线的属性,如果找到则赋值
4.    如果还是找不到,则报错(可以让它不报错,后文会详述)
疑问解密2:复合路径
  1.   setValue:属性值 forKeyPath:属性路径 valueForKeyPath:属性名
复制代码
后面带Path的跟之前我们用的KVC有什么不同呢?我们来研究研究!
假设此时有一个Dog类,而Person类里也有个属性是Dog类型的,叫pet,如图
如果此时实例化Person对象,要用KVC操作pet属性里的nickName属性就不太方便,只能先取出pet属性指向的Dog对象,再来操作nickName属性,如下:


而带Path的方法,就是用来简化这种操作的,我们看


因此,也就是说,如果需要操作访问一些“属性里的属性”时,就用带Path的方法来操作。
       疑问解密3
            如果用KVC赋值时,某一个Key,类中没有会怎样?
例如:我们的HMPerson类现在没有salary属性。


此时,通过KVC的方式赋值,运行时会崩溃

因此,用KVC时传入的Key必须保证类中存在同名的属性。否则会运行时崩溃。那么如果我不希望运行时直接崩溃,而是来一个相对友好的提示,不要让它崩溃,该怎么办呢?
我们就需要在HMPerson类里重写setValue:值   forUndefinedKey:键方法,这样,当用KVC对Person对象赋值了一个Key与属性对应不上的错误时,系统会自动调用这个方法,我们来试试看!
如图:


此时,无论你输错多少次HMPerson对象不存在的属性时,都不会在运行时让程序崩溃,达到报错“友好”的目的。

总结
            KVC是一套方便我们用字符串来操作对象的机制,可以使得操作对象时跟操作字典一样的灵活。在字典转模型的领域中应用起来极为方便,并且KVC可以轻松的帮我们突破访问限制的一些问题,直接访问到私有成员。
            但是同样,KVC也有其缺点:例如在编码时很容易输错key导致问题,语法相较点语法而言也略微繁琐。但万事万物不也正如KVC一般既有其优点,也存在其不足之处,不是吗?

系列回顾:
【iOS开发入门】你真的了解KVC吗?(上) --- KVC的简单使用

【iOS开发入门】你真的了解KVC吗?(中) --- KVC优点合集


精华推荐:

4 个回复

倒序浏览
都干嘛呢?在做什么,没人点赞
回复 使用道具 举报
nice!
回复 使用道具 举报
要学的东西太多了
回复 使用道具 举报 1 0
多谢分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马