IOS开发 -11.KVO

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值