KVO,观察者模式,添加观察者,监听被观察者对象属性,最后要移除观察者
使用方法:
- (void)viewDidLoad {
[super viewDidLoad];
_person = [Person new];
_person.name = @"old";
[_person addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionOld context:nil];
_person.name = @"new";
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
NSLog(@"change=%@",change);
}
- (void)dealloc
{
[_person removeObserver:self forKeyPath:@"name"];
}
1.开启方式分为:自动和手动,
自动:
+ (BOOL)automaticallyNotifiesObserversOfName
{
return YES;
}
手动时需要将这个类方法改为no就可以了
+ (BOOL)automaticallyNotifiesObserversOfName
{
return NO;
}
[_person willChangeValueForKey:@"name"];
_person.name = @"yinguoqiang";
[_person didChangeValueForKey:@"name"];
2.实现原理:kvo利用运行时,生成一个对象的子类,并生成子类对象,替换原来的isa指针,并且重写了set方法
观察者模式是否监听对象的地址?
不会监听,是重写对象的set方法,然后手动开启观察者模式。