下面的原理仔细品尝喔~多读几遍就可以理解了,当然理解不了就按我说的来点 KVO 的代码,最后都能理解
1.当一个 object(对象) 有观察者时候,动态创建这个 object(对象) 的类的子类
2.对于每个被观察的 property(属性),重写其 setter 方法
3.在重写的 setter 方法中调用 -willChangeValueForKey: 和 -didChangeValueForKey: 通知观察者
4.当一个 property(属性) 没有观察者时,删除重写的方法
5.当没有 observer(观察者) 观察任何一个 property(属性) 时,删除动态创建的子类
例如:创建Person类,创建一个age属性,并监听这个属性的值得变化
self.person = [Person new];
self.person.age = 18;
NSLog(@"isa:%@",[self.person valueForKeyPath:@"isa"]);
[self.person addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionNew context:nil];
NSLog(@"isa:%@",[self.person valueForKeyPath:@"isa"]);
self.person.age = 20;
//控制台打印的结果:
2016-08-06 12:59:57.406 KVO原理[1100:84614] isa:Person
2016-08-06 12:59:57.407 KVO原理[1100:84614] isa:NSKVONotifying_Person
因为:isa是一个Class 类型的指针. 每个实例对象有个isa的指针,他指向对象的类,根据这个指针很容易就会查到他所指的类,
所以NSKVONotifying_Person是Person类的子类,
因此:KVO机制动态创建一个对象person当前类的子类,并为这个新的子类重写了被观察属性keyPath的setter 方法。setter 方法随后负责通知观察对象属性的改变状况---Objective-C 强大的 Runtime---->动态的创建一个类
网友评论