第二十三篇:KVC和KVO实现的原理

2022-11-26  本文已影响0人  坚持才会看到希望

KVC被用来进行赋值操作,下面是KVC的官方文档介绍:


8711669515793_.pic.jpg

下面这些代码是KVC进行赋值时候,其会找set方法,然后进行赋值操作,


8721669517904_.pic.jpg 8731669517919_.pic.jpg

如果没有set方法,其就会找_set方法,如下:


8741669518179_.pic.jpg

如果没有set方法和set方法,其就会按顺序查找<key>,_is<key>,<key>或is<key>的实例变量。需要添加accessInstanceVariablesDirectly返回YES。

8771669518746_.pic.jpg 8761669518699_.pic.jpg

当上面方法都没有的时候,其会调用如下图方法:

8781669518904_.pic.jpg

KVC的取值过程

下面是官方文档的介绍:


8801669521029_.pic.jpg

KVO的实现 (需要移除KVO监听)

kvo是基于kvc的实现的,下面是常用的KVO代码,先通过添加监听,然后进行赋值,然后就会调用observeValueForKeyPath方法。

8821669523202_.pic.jpg

下面是dealloc方法,这个方法,其实这里移除监听在new方法创建的时候可以写和不写的,因为其内部会将其释放掉。如果这个是用单例方法创建的时候,将会闪退,这个是因为单例是存在静态区域的,这个地方是不会释放的,当添加监听的时候控制器已经释放了,这样就导致找不到对应的控制器,所以会闪退,所以需要添加移除监听的方法。


8841669523934_.pic.jpg 8831669523425_.pic.jpg

KVO可以手动关闭和触发吗

是可以的,通过重写这个方法,在其里面设置NO就会关闭

8851669524917_.pic.jpg

下面这个是手动触发KVO


8861669529859_.pic.jpg

KVO的原理

当我们添加addObserver监听的时候,其会动态产生一个NSKVONotifying_LGPerson的名,其是一个临时的帮助我们实现某个功能的,


8871669530212_.pic.jpg

遍历NSKVONotifying_LGPerson后其内部有个set方法。


8881669531178_.pic.jpg

然后其会调用willchangevalueforkey和didchangevalueforkey这些方法。键值的改变其也是用的kvc。

在用KVO时候有个好的框架,FBKVO这个,它可以不用进行手动remove,解决回调函数代码很多等。

自定义KVO,及KVO的流程核心代码

8901669550481_.pic.jpg
上一篇 下一篇

猜你喜欢

热点阅读