1.底层实现
1.当某个类添加了监听时,系统会动态的为该类创建一个子类,并且把isa指向该类的子类,然后重写监听属性的set方法。在willChangedValueForKey方法里面对old赋值,在didChangedValueForKey里面对new赋值,并调用监听触发方法。
2.手动触发,设定触发条件
//该方法内拦截系统的响应
+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key {
if ([key isEqualToString:@"age"]) {
return false;
}
return [super automaticallyNotifiesObserversForKey:key];
}
- (void)setAge:(NSInteger)age {
//判断条件是否满足
if (age > 18) {
//条件满足之后赋值并手动触发kvo
[self willChangeValueForKey:@"age"];
//由于已经在系统方法处进行的对age的拦截,所以直接赋值的时候不会响应到kvo
_age = age;
[self didChangeValueForKey:@"age"];
}else{
_age = age;
}
}
网友评论