大佬链接
详情分析
@interface Person : NSObject
@property(nonatomic,copy)NSString *name;
@property(nonatomic,assign)NSInteger age;
@end
@implementation Person
- (instancetype)init
{
self = [super init];
if (self) {
NSLog(@"%@",[self class]);
}
return self;
}
- (void)willChangeValueForKey:(NSString *)key
{
[super willChangeValueForKey:key];
NSLog(@"%s",__FUNCTION__);
}
- (void)didChangeValueForKey:(NSString *)key
{
[super didChangeValueForKey:key];
NSLog(@"%s",__FUNCTION__);
}
self.person = [[Person alloc] init]
self.person.name = @"aaa"
self.person2 = [[Person alloc] init]
self.person2.name = @"roy"
// 注册观察者
NSKeyValueObservingOptions options = NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld
[self.person addObserver:self forKeyPath:@"name" options:options context:@"111"]
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
NSLog(@"监听对象:%@ - 属性%@ - %@ %@",object,keyPath,change,context);
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
self.person2.name = @"Captain";
[self.person willChangeValueForKey:@"name"];
self.person.name = @"ccc";
[self.person didChangeValueForKey:@"name"];
}
-(void)dealloc
{
[self.person removeObserver:self forKeyPath:@"name"];
}
- 当属性值没有改变监听不会打印,可以通过如下设置监听
[self.person willChangeValueForKey:@"name"]
self.person.name = @"ccc"
[self.person didChangeValueForKey:@"name"]