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.jpgKVC的取值过程
下面是官方文档的介绍:
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,解决回调函数代码很多等。
网友评论