KVC被用来进行赋值操作,下面是KVC的官方文档介绍:
下面这些代码是KVC进行赋值时候,其会找set方法,然后进行赋值操作,
如果没有set方法,其就会找_set方法,如下:
如果没有set方法和set方法,其就会按顺序查找<key>,_is<key>,<key>或is<key>的实例变量。需要添加accessInstanceVariablesDirectly返回YES。
当上面方法都没有的时候,其会调用如下图方法:
KVC的取值过程
下面是官方文档的介绍:
KVO的实现 (需要移除KVO监听)
kvo是基于kvc的实现的,下面是常用的KVO代码,先通过添加监听,然后进行赋值,然后就会调用observeValueForKeyPath方法。
下面是dealloc方法,这个方法,其实这里移除监听在new方法创建的时候可以写和不写的,因为其内部会将其释放掉。如果这个是用单例方法创建的时候,将会闪退,这个是因为单例是存在静态区域的,这个地方是不会释放的,当添加监听的时候控制器已经释放了,这样就导致找不到对应的控制器,所以会闪退,所以需要添加移除监听的方法。
KVO可以手动关闭和触发吗
是可以的,通过重写这个方法,在其里面设置NO就会关闭
下面这个是手动触发KVO
KVO的原理
当我们添加addObserver监听的时候,其会动态产生一个NSKVONotifying_LGPerson的名,其是一个临时的帮助我们实现某个功能的,
遍历NSKVONotifying_LGPerson后其内部有个set方法。
然后其会调用willchangevalueforkey和didchangevalueforkey这些方法。键值的改变其也是用的kvc。
在用KVO时候有个好的框架,FBKVO这个,它可以不用进行手动remove,解决回调函数代码很多等。