我在上一篇文章 [iOS] 从使用 KVO 监听 readonly 属性说起 中谈了使用 KVO 一些问题。里面谈到了 KVO 的原理,我在网上搜了一下 KVO 原理,发现大家说的都是一样的。但是我在实际使用中发现事实并不是网上说的那样。所以打算用代码的形式来一步一步探究 KVO 的原理。
说一下我们的代码场景:一个人类 Person,他的朋友把狗 LeLe 寄养在他那里,然后他自己有一只猫 Tom。因为他自己没有狗,所以狗是 readonly 的。
Person 类的 .h 文件是这样的:
- @interface Person : NSObject
- @property(nonatomic, strong)NSString *aCat;
- @property(nonatomic, strong, readonly)NSString *aDog;
- // 寄养狗
- -(void)careDog:(id)dog;
- @end
Person 类的 .m 文件是这样的:
- #import "Person.h"
- @implementation Person
- -(void)careDog:(id)dog{
- [self setValue:dog forKey:@"aDog"];
- }
- -(void)willChangeValueForKey:(NSString *)key{
- [super willChangeValueForKey:key];
- NSLog(@"willChangeValueForKey");
- }
- @end
控制器的代码是这样的:
- #import "ViewController.h"
- #import "Person.h"
- @interface ViewController ()
- // 人
- @property(nonatomic, strong)Person *p;
- // 狗
- @property(nonatomic, strong)NSString *d;
- // 猫
- @property(nonatomic, strong)NSString *c;
- @end
- @implementation ViewController
- - (void)viewDidLoad {
- [super viewDidLoad];
- self.p = [Person new];
- self.d = @"LeLe";
- self.c = @"Tom";
- // 开始监听:第一个断点位置
来源: https://juejin.im/post/5a3118f5f265da431523e8bf