KVC、KVO

聊聊KVO、KVC(仅用作自己复习记录不喜勿喷)

KVC:Key Value Coding 键值编码

KVO:Key Value Observer 键值监听

可以先从KVO开始讲

我们开发中时常会需要对某个对象的某个属性值的变化进行监听,如果这个值发生遍话,就拿到这个事件,并做我们自己的逻辑处理。比如一个Person对象,内有一个int a属性,当a的值放生变化时,我们就可以感知到这个事件。

它的底层实现,其实是在添加监听者的时候,由runtime 动态的创建了一个Person子类,并且重写了该子类的setAge:方法,在重写这个方法时,分了几个步骤:

1、willChangeValueForKey:  

2、_age = age  

3、didChangeValueForKey: 

内部会触发监听器(Observer)的监听方法(observeValueForKeyPath:ofObject:context:)

根据上述底层原理,可以推出以下结论,当然也可以写demo来验证

1、如果希望手动触发KVO,只需要手动调用willChangeValueForKey:  和didChangeValueForKey: 

2、如果通过->箭头函数修改对象的成员变量值,不会触发KVO,因为这种方式并没有调用到set方法。

另外KVO还有个缺点,就是我们在写监听成员变量字段的时候,必须使用字符串来写,这样的话,系统就没有提示了,如果写错了,也不会有报错提示,这样会存在一定的隐患。

如何优化这个问题呢?

1、比如我们想监听age,之前的写法是@"age",那么如果我改成person.age这种就可以了。当然还有参数类型,需要知道这个参数是int float 还是NSString、或者其他。  那我们可以参考沙盒的方式,setInteger:forKey:,setFloat:forKey:,setObject: forKey:.  

2、如果采取这种方式,接口可能太多了。可以试试通过runtime的接口 ivar_getTypeEncoding    ivar_getName   class_copyIvarList 这种获取成员变量列表,以及获取成员变量类型、然后进行比对,的方式来获取传入值的类型,知道类型以后,后续的操作,就可以按照1中的方式来做了。

下面再讲讲KVC的

KVC我们常用到的就是取值valueForKey和 设置值setValueForKey,比如我们想通过KVC更改person对象中age的值,那么就可以调用 [person setValue@18 ForKey@"age"]; 其实这里底层也是调用的set方法,拿到age字符串之后,先把第一个字母变大写,然后前面拼接 @"set", 变成set方法 setAge:。 可以试试,通过KVC的修改age,是可以触发KVO事件的。 然后取值,valueForKey也是同样原理调用的get方法


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

相关阅读更多精彩内容

  • @[TOC](IOS底层(三) KVO底层实现原理 ) 一,KVO简述 KVO的全称 Key-Value Obse...
    孔雨露阅读 829评论 0 6
  • KVC KVC定义 KVC(Key-value coding)键值编码,就是指iOS的开发中,可以允许开发者通过K...
    暮年古稀ZC阅读 2,292评论 2 9
  • 一、KVO 问题 iOS用什么方式实现对一个对象的KVO?(KVO的本质是什么?) 如何手动触发KVO? 1. K...
    CoderJRHuo阅读 679评论 0 0
  • 1. KVO 一.KVO原理的使用与证明 我们在开发的过程中经常使用KVO和KVC,但是我们并不了解其底层原理和功...
    周灬阅读 924评论 0 9
  • KVC KVC定义 KVC(Key-value coding)键值编码,就是指iOS的开发中,可以允许开发者通过K...
    恋空K阅读 831评论 0 2

友情链接更多精彩内容