Demo地址
Demo中包含本人学习的所有资料,还有一些封装的Pod组件,欢迎下载Star,如果有错误的地方,还请指出,详情查看 README.md
KVO 研究
众所周知,KVO 可以监听属性 ,那么 KVO 可以监听成员变量吗?
答案是肯定的,下面通过代码来证明结论
测试代码
//添加 KVO ,监听 person 对象 的 _reName
-(void)addObserver{
BSObjcPerson *person1 = [[BSObjcPerson alloc]init];
self.person = person1;
[person1 addObserver:self forKeyPath:@"_reName" options:NSKeyValueObservingOptionNew context:nil];
}
// KVO 回调
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
NSLog(@"observeValueForKeyPath == %@",keyPath);
if ([keyPath isEqualToString:@"reName"]) {
NSLog(@"reName : %@",self.person.reName);
}
if ([keyPath isEqualToString:@"_reName"]) {
NSLog(@"_reName : %@",self.person.reName);
}
}
// 通过 KVC 修改 person 的 reName 的值
-(void)changePersonName{
[self.person setValue:@"222" forKeyPath:@"reName"];
[self.person setValue:@"333" forKeyPath:@"_reName"];
}
测试结果
BSFrameworks_Example[81892:7139386] observeValueForKeyPath == _reName
BSFrameworks_Example[81892:7139386] _reName : 333
重写 person 对象 的 setReName 方法,发现通过
[self.person setValue:@"222" forKeyPath:@"reName"];
设置 reName 的值,会触发 setReName 方法,而 forKeyPath:@"_reName" 是不会触发 set 方法的,但是可以成功修改成员变量的 value
将测试代码修改下,在本 VC 中添加属性,然后 KVO 监听这个属性对应的成员变量,通过 成员变量直接赋值(_reName = @"123"),发现无法触发 KVO 回调
总结
-
KVO可以通过成员变量监听,但是需要使用KVC更改成员变量的值,无法通过成员变量直接赋值触发KVO,即:KVO的key和KVC的key需要相同,都需要带_ -
KVC通过属性(不带_)会触发set方法,所以KVC肯定可以通过设置属性的值来触发KVO