三步:
1.添加一個(gè)觀察者
2.實(shí)現(xiàn) 觀察者模式觸發(fā)的方法
3.移除觀察者的方法
一般在ARC情況下,dealloc 中實(shí)現(xiàn)的方法:
1.釋放觀察者 ,2.釋放代理
- (void)dealloc
{
3. 只要寫了 KVO,那就一定要寫移除觀察者的方法
[self removeObserver:self forKeyPath:@"array"];
}
- (void)viewDidLoad
{
[super viewDidLoad];
//KVO : (Key - value - Observer) 鍵值觀察者
self.array = [NSMutableArray array];
//1. 添加一個(gè)觀察者
// 第一個(gè)self 表示觀察者
// 第一個(gè)參數(shù) : 被觀察者
// 第二個(gè)參數(shù) : 哪一個(gè)屬性
// 第三個(gè)參數(shù) : 什么時(shí)候觸發(fā)觀察者的方法
// 第四個(gè)參數(shù) : 保險(xiǎn), 可以添加一些字符串,一般是nil
// 誰去觀察誰的哪一個(gè)屬性,檢查他變化的時(shí)間
[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]; 這樣不可以觀察一個(gè)初始化過的數(shù)組 ,不會(huì)觸發(fā) observe 方法
// self mutableSetValueForKeyPath:<#(nonnull NSString *)#> 這個(gè)是觀察無序的,字典或者集合
// KVC的方法
[[self mutableArrayValueForKeyPath:@"array"] setArray:array];
//這個(gè)是有序的,數(shù)組,這樣才會(huì)觸發(fā)observe方法
}
// 2. 觀察者模式觸發(fā)的方法- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
{
NSLog(@"keypath === %@", keyPath);
NSLog(@"object === %@", object);
NSLog(@"change === %@",change);
}