复习 KVO - 1
2018-08-08 本文已影响0人
文瑶906
新建一个 Person 类,这个类中有一个 年龄 age 属性
@interface WYPerson : NSObject
/// 年龄
@property (nonatomic, assign) NSInteger age;
@end
在外界使用 KVO 调用:
#import "WYPerson.h"
@interface ViewController ()
@property (nonatomic, strong) WYPerson *person;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
/* 要做的事情:
* 每增加一岁,就过一个生日
*/
WYPerson *aPerson = [WYPerson new];
_person = aPerson;
// 监听 年龄 -> 有监听,当不需要的时候就销毁
// 如果不是全局变量是局部变量,可以不用销毁,因为大括号完毕后就会自动销毁
[_person addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionNew context:nil];
}
- (void)dealloc {
[_person removeObserver:self forKeyPath:@"age"];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context {
NSLog(@"KVO 监听年龄的改变 %ld", (long)_person.age);
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
// 年龄发生改变的时候,KVO 开始监听
_person.age++;
}
KVO 是监听 set 方法有没有调用
- _person -> _age += 1; 这个不是 set 方法,所以不会走 KVO 监听
KVO 如何实现 监听
- 调用 addObserver 方法的时候,就会动态(runtime)生成一个 WYPerson 子类(又叫派生类)
- 这个子类会继承 父类的所有方法,目的: 重写 父类属性的 set 方法。
2.1 为什么要重写?
因为要在重写的 set 方法中去监听属性的改变 - 修改对象的 isa 指针