三步:
1.添加一个观察者
2.实现 观察者模式触发的方法
3.移除观察者的方法
一般在ARC情况下,dealloc 中实现的方法:
1.释放观察者 ,2.释放代理
- (void)dealloc
{
3. 只要写了 KVO,那就一定要写移除观察者的方法
[self removeObserver:self forKeyPath:@"array"];
}
- (void)viewDidLoad
{
[super viewDidLoad];
//KVO : (Key - value - Observer) 键值观察者
self.array = [NSMutableArray array];
//1. 添加一个观察者
// 第一个self 表示观察者
// 第一个参数 : 被观察者
// 第二个参数 : 哪一个属性
// 第三个参数 : 什么时候触发观察者的方法
// 第四个参数 : 保险, 可以添加一些字符串,一般是nil
// 谁去观察谁的哪一个属性,检查他变化的时间
[self addObserver:self forKeyPath:@"array" options:(NSKeyValueObservingOptionNew) context:nil];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{ NSArray *array = @[@"1", @"2"];
// [self.array setArray:array]; 这样不可以观察一个初始化过的数组 ,不会触发 observe 方法
// self mutableSetValueForKeyPath:<#(nonnull NSString *)#> 这个是观察无序的,字典或者集合
// KVC的方法
[[self mutableArrayValueForKeyPath:@"array"] setArray:array];
//这个是有序的,数组,这样才会触发observe方法
}
// 2. 观察者模式触发的方法- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
{
NSLog(@"keypath === %@", keyPath);
NSLog(@"object === %@", object);
NSLog(@"change === %@",change);
}