IOS开发 -11.KVO

来源:互联网 发布:iphone虚拟机型软件 编辑:程序博客网 时间:2024/06/13 21:25

1.KVO概述

  • KVO,即:Key-Value Observing,它提供一种值监听机制,用来监听制定对象的属性的变化。简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了

2.KVO基本使用

  • 监听某个对象属性的改变
// 假定我有一个Person类,类中有name属性和age属性@interface Person : NSObject{    @public    int _age;}/** 姓名*/@property (nonatomic, copy)NSString *name;/** 年龄*/@property (nonatomic, assign)int age;@end//在控制器中创建一个Person对象,并初始化name和age属性    Person *p = [Person new];    p.name = @"MR";    p.age = 25;
  • 添加监听方法
// 若是我在控制器中更改了对象的年龄值,修改了好多次,这时我想知道年龄什么时候被修改了,修改前后的值的情况,这里就可以使用KVO监听age属性/*第一个参数:告诉系统添加谁为监听者第二个参数:监听当前对象的哪个属性第三个参数:监听到属性改变之后,传递什么值NSKeyValueObservingOptionOld 传递改变前的旧值NSKeyValueObservingOptionNew 传递改变后的新值第四个参数:需要传递的参数(这个参数不是传递给属性的,传递给监听到数据改变后调用的方法)*/// 添加监听方法:addObserver:forKeyPath:// 给p这个对象添加一个监听 , 监听p对象的age属性的改变, 只要age属性改变就通知self(控制器)[p addObserver:self forKeyPath:@"age" options:nil context:nil];// 注意: 如果使用KVO监听某个对象的属性, 当对象释放之前一定要移除监听,不然会报如下经典错误//  reason: 'An instance 0x7f9483516610 of class Person was deallocated while key value observers were still registered with it.// 从p对象上移除self对它的age属性的监听方法[p removeObserver:self forKeyPath:@"age"];
  • 监听到对象属性发生改变后会调用如下方法
// 只要监听到属性的改变就会调用// keyPath: 被监听的属性名称// object : 被监听的对象// context: 注册监听的时候传入的值- (void)observeValueForKeyPath:(nullable NSString *)keyPath ofObject:(nullable id)object change:(nullable NSDictionary *)change context:(nullable void *)context{    NSLog(@"keyPath = %@, object = %@ , change = %@, context = %@", keyPath, object, change, context);}

3.KVO实现原理

  • 只要给对象属性添加一个监听者,那么在程序运行时,系统就会自动给该对象生成一个子类对象,并且重写自动生成的子类对象的被监听属性的set方法
  • 即自动创建NSKVONotifying_Person子类中,并重写属性的set方法如下:
-(void)setAge:(int)age{    NSLog(@"返回改变前的值为%d",age);//仅仅用来模拟说明实现原理    _age = age;    NSLog(@"返回改变后的值为%d",age);//仅仅用来模拟说明实现原理}
  • 注意: KVO只能监听通过set方法修改的值
0 0
原创粉丝点击