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
- IOS开发 -11.KVO
- iOS开发-kvo
- IOS开发-KVO
- IOS开发-KVO
- IOS开发-KVO详解
- IOS应用开发-KVC/KVO
- iOS开发-KVO观察容器类
- ios开发--KVO解析
- ios开发-KVO
- iOS开发--KVC & KVO
- iOS开发 - KVO/KVC
- iOS开发 - KVO
- iOS开发中的kvo机制
- iOS开发:KVO和KVC
- iOS开发之KVC、KVO
- keyPathForValuesAffectingValueForKey ios开发 kvo相关
- iOS开发 KVC和KVO
- IOS开发 - KVC 和 KVO
- JSPatch 热更新框架的个人评估
- swift 值类型和引用类型
- LintCode Trailing Zeros 尾部的零
- OC总结
- Linux中profile、bashrc、bash_profile之间的区别和联系
- IOS开发 -11.KVO
- C5_二维数组
- iOS 开发常用宏
- android- Auto Monitor Logcat
- SSL构建单双向https认证!https部署及注意事项!
- gdb显示完整字符串
- POJ3250 Bad Hair Day 单调栈
- Cocos2D-x 入门(3) ---基本概念
- Android-编译环境搭建(多版本JDK切换)