KVO & KVC 学习

2020-02-28  本文已影响0人  Tony17

前言

在 OC 的学习过程中,KVO 和 KVC 是我们经常提到的。我一直没有很清楚的搞明白 KVC 是个啥。今天开看一下。

KVO & KVC

KVO

OC 中的 KVO 机制常用于实现类的监听,在被监听的值改变的时候可以自动调用监听方法,用于解耦。

如果一个类被添加了KVO监听,则会自动把该类对象改为NSKVONotifying_XXX类,NSKVONotifying_XXX类是通过runtime创建的XXX类的子类。

KVO本质

如果要触发KVO机制,必须调用到set方法,如果使用直接复制的方式,则无法触发KVO

KVC

KVCkey-value-coding 的简称,是OC的特性之一.

常用API:

key 和 keyPath 的区别是,keyPath是多层级的,a.b.c 的方式来访问属性,key为当前层级,不可以访问子级。

KVC 原理

调用-(void)setValue:(id)value forKey:(NSString *)key的时候, 方法调用流程:

  1. setKey:
  2. _setKey:
  3. accessInstanceVariablesDirectly 这方法如果返回YES,跳转到第4步,如果返回NO,跳转到第5步
  4. 依次查找 _key、_isKey、key、isKey 如果找到了则直接赋值,如果没有找到,跳转到第5步
  5. 调用setValue:forUndefinedKey:
    setValueForKey.png

调用-(id)valueForKey:(NSString *)key的时候, 方法调用流程:

  1. 依次调用 getkey、key、isKey、_key 方法如果存在则直接返回,如果不存在则跳转到第2步
  2. accessInstanceVariablesDirectly 这方法如果返回YES,跳转到第3步,如果返回NO,跳转到第4步
  3. 依次查找 _key、_isKey、key、isKey 如果找到了则直接赋值,如果没有找到,跳转到第4步
  4. 调用valueForUndefinedKey:
valueForKey.png

最后

以上就是本篇的内容,势必会有一些遗漏和错误,欢迎斧正~

上一篇 下一篇

猜你喜欢

热点阅读