utomatic = YES;
if ([key isEqualToString:@"age"]) {
automatic = NO;
} else {
automatic = [super automaticallyNotifiesObserversForKey:key];
}
return automatic;
}
//重写setter方法手动设置KVO
- (void)setAge:(int)age {
//手动设置KVO
if (_age != age) {
[self willChangeva lueForKey:@"age"];
_age = age;
[self didChangeva lueForKey:@"age"];
}
} 注意:一般的建议是,在获取属性值时,可以用实例变量,在设置属性值时,尽量用setter方法,以保证属性的KVO特性。
KVO的实现原理
- 当某一个类的实例第一次使用KVO的时候,系统就会在运行期间动态的创建该类的一个派生类,该类的命名规则一般是以NSKVONotifying为前缀,以原本的类名为后缀。并且将原型的对象的isa指针指向该派生类。同时在派生类中重载了使用KVO的属性的setter方法,在重载的setter方法中实现真正的通知机制,正如前面我们手动实现KVO一样。这么做是基于设置属性会调用 setter 方法,而通过重写就获得了 KVO 需要的通知机制。当然前提是要通过遵循 KVO 的属性设置方式来变更属性值,如果仅是直接修改属性对应的成员变量,是无法实现 KVO 的。
代码-大家可以去我的github去下载
KVO-Demo网址