KVO和KVC

2022-08-30  本文已影响0人  恋家的人走不丢
全称

KVO的使用

使用过程

原理

测试类 Person

  1. 系统会生成NSKVONotifying_Person类,该类继承Person,并且将Person的isa指向NSKVONotifying_Person。

  2. NSKVONotifying_Person从写监控属性的setter方法,内部调用_assetXXXValueAndNotify();
    _assetXXXValueAndNotify内部实现:

    2.1 - (void)willChangeValueForKey:(NSString *)key;

    2.2- (void)didChangeValueForKey:(NSString *)key;

    2.3 didChangeValueForKey里面调用 [super didChangeValueForKey]时,会触发回调方法
    - (void)observeValueForKeyPath:(NSString*)keyPathofObject: (id)objectchange:(NSDictionaryid> *)changecontext:(void*)context

    通知开发者数据发生变化。

3.NSKVONotifying_Person内部还会从写 - (Class)class; 方法,目的是隐藏系统生成的类。

4.如果需要手动调用,只需要调用2个方法:
willChangeValueForKey
didChangeValueForKey
即可;
5.单纯使用KVO,访问成员变量person -> age = 10;是不会触发KVO监听的。

KVC setValueForKey: 和setValueForKeyPath:

假如Person对象有个属性叫age

setValueForKey
setValueForKeyPath:入参是路径,

使用KVC赋值

例如Person中有一个age属性

  1. _age
  2. _isAge
  3. age
  4. isAge

如果方法未找到,上面4个属性也未找到,则会报上面的异常setValue:forUndefineKey

KVC取值 valueForKey: 和valueForKeyPath:

  1. getKey
  2. key
  3. isKey
  4. _key

如果方法未找到,则会调用系统方法+ (BOOL)accessInstanceVariablesDirectly判断是否可以直接访问成员变量,如果是NO,则会报valueForUndefineKey,如果是YES,则会按如下顺序查找成员变量:

  1. _key
  2. _isKey
  3. key
  4. isKey
上一篇下一篇

猜你喜欢

热点阅读