當(dāng)觀察某對(duì)象 A 時(shí)收捣,KVO 機(jī)制動(dòng)態(tài)創(chuàng)建一個(gè)對(duì)象A當(dāng)前類的子類,并為這個(gè)新的子類重寫了被觀察屬性 keyPath 的 setter 方法庵楷。setter 方法隨后負(fù)責(zé)通知觀察對(duì)象屬性的改變狀況罢艾。
Apple 使用了 isa 混寫(isa-swizzling)來實(shí)現(xiàn) KVO 。當(dāng)觀察對(duì)象A時(shí)尽纽,KVO機(jī)制動(dòng)態(tài)創(chuàng)建一個(gè)新的名為:NSKVONotifying_A 的新類咐蚯,該類繼承自對(duì)象A的本類,且 KVO 為 NSKVONotifying_A 重寫觀察屬性的 setter 方法弄贿,setter 方法會(huì)負(fù)責(zé)在調(diào)用原 setter 方法之前和之后春锋,通知所有觀察對(duì)象屬性值的更改情況。
修改
使用方法,可實(shí)現(xiàn)取消系統(tǒng)kvo差凹,自己觸發(fā)期奔,也就可控。
+(BOOL)automaticallyNotifiesObserversForKey:(NSString *)key{
if ([key isEqualToString:@"name"]) {
return NO;
}else{
return [super automaticallyNotifiesObserversForKey:key];
}
}
-(void)setName:(NSString *)name{
if (_name!=name) {
[self willChangeValueForKey:@"name"];
_name=name;
[self didChangeValueForKey:@"name"];
}
}