KVO(key value observer)浅解及实例

来源:互联网 发布:个人淘宝账号查询 编辑:程序博客网 时间:2024/06/06 01:09

KVO

1.那么什么是KVO呢?

统称:键值监听.英文名为:key value observer,`监听对象属性变化`的一种手段,可以用在开源框架,让代码解耦。例如:`上拉、下拉刷新控件

2.KVO的原理是什么呢?

底层实现运行时,动态添加的一个子类,同时重写set方法,调用observeValueForKeyPath方法.

3.KVO在代码实现过程中所做的事情又有哪些呢?

    做的事情
    1).更改了person的isa指针

    未使用KVO之前isa指向如下图:


   使用KVO之后isa指向如下图:


    2).保存了参数: 1 监听者  2 枚举  3 携带参数

<span style="font-size:14px;"></span><pre name="code" class="objc">     //KeyPath    //参数: 1 监听者  2 枚举  3 携带参数 4 实现了 observeValueForKeyPath    [p addObserver:self         forKeyPath:@"height"            options:NSKeyValueObservingOptionOld |NSKeyValueObservingOptionNew           context:nil];

    3).创建 NSKVONotifying_GHPerson  类 person的子类 

    验证方法:可通过创建一个继承自NSObject的子类(NSKVONotifying_GHPerson),其它不要任何操作,运行程序,会立马崩溃.说明说创建的子类与person的子类重名!若不相信,可随便创建一个继承自NSObject的子类,名字随便取,除了NSKVONotifying_GHPerson这个名字除外,发现程序正常运行.有不懂的可以私聊!!!

   4).重写NSKVONotifying_GHPerson set 方法 

- (void)setAge:(NSInteger)age{    [super setAge:age];}

重写目的:就是为了取值,取改变后的值.

   5).set 方法 1.调用父类的set  2.调用监听者的observeValueForKeyPath

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object                         change:(NSDictionary<NSString *,id> *)change context:(void *)context{    NSLog(@"%@",change);}

在最后一定要切记,记得在创建了KVO监听者后,一定记得销毁:

- (void)dealloc
{
    [self.p removeObserver:self forKeyPath:@"age"];

}

总结:个人觉得关于KVO的解析还不是很完善,希望大家多多给予修改意见,大家共同进步.


0 0
原创粉丝点击