KVC被用来进行赋值操作,下面是KVC的官方文档介绍:
![](https://img.haomeiwen.com/i9297435/fc6ae6e721b5e3d6.jpg)
下面这些代码是KVC进行赋值时候,其会找set方法,然后进行赋值操作,
![](https://img.haomeiwen.com/i9297435/5427c269cbac071b.jpg)
![](https://img.haomeiwen.com/i9297435/651e90e4e3d81d0e.jpg)
如果没有set方法,其就会找_set方法,如下:
![](https://img.haomeiwen.com/i9297435/64aa513499e27e77.jpg)
如果没有set方法和set方法,其就会按顺序查找<key>,_is<key>,<key>或is<key>的实例变量。需要添加accessInstanceVariablesDirectly返回YES。
![](https://img.haomeiwen.com/i9297435/90e623d91fc0d166.jpg)
![](https://img.haomeiwen.com/i9297435/a0e6832eab33b7ac.jpg)
当上面方法都没有的时候,其会调用如下图方法:
![](https://img.haomeiwen.com/i9297435/8533be7ab2f33f6e.jpg)
KVC的取值过程
下面是官方文档的介绍:
![](https://img.haomeiwen.com/i9297435/398a42c15d659ea7.jpg)
KVO的实现 (需要移除KVO监听)
kvo是基于kvc的实现的,下面是常用的KVO代码,先通过添加监听,然后进行赋值,然后就会调用observeValueForKeyPath方法。
![](https://img.haomeiwen.com/i9297435/bf36518e04f4332c.jpg)
下面是dealloc方法,这个方法,其实这里移除监听在new方法创建的时候可以写和不写的,因为其内部会将其释放掉。如果这个是用单例方法创建的时候,将会闪退,这个是因为单例是存在静态区域的,这个地方是不会释放的,当添加监听的时候控制器已经释放了,这样就导致找不到对应的控制器,所以会闪退,所以需要添加移除监听的方法。
![](https://img.haomeiwen.com/i9297435/e9c0065346bd8a3e.jpg)
![](https://img.haomeiwen.com/i9297435/db4969d4e74d9f15.jpg)
KVO可以手动关闭和触发吗
是可以的,通过重写这个方法,在其里面设置NO就会关闭
![](https://img.haomeiwen.com/i9297435/f9e650b7c3ac2c8f.jpg)
下面这个是手动触发KVO
![](https://img.haomeiwen.com/i9297435/bda8efaeb9866f2e.jpg)
KVO的原理
当我们添加addObserver监听的时候,其会动态产生一个NSKVONotifying_LGPerson的名,其是一个临时的帮助我们实现某个功能的,
![](https://img.haomeiwen.com/i9297435/517f414b5692e36a.jpg)
遍历NSKVONotifying_LGPerson后其内部有个set方法。
![](https://img.haomeiwen.com/i9297435/f24672cad7903f75.jpg)
然后其会调用willchangevalueforkey和didchangevalueforkey这些方法。键值的改变其也是用的kvc。
在用KVO时候有个好的框架,FBKVO这个,它可以不用进行手动remove,解决回调函数代码很多等。
自定义KVO,及KVO的流程核心代码
![](https://img.haomeiwen.com/i9297435/c288fd6974950dce.jpg)
网友评论