KVO的原理-小结

下面的原理仔细品尝喔~多读几遍就可以理解了,当然理解不了就按我说的来点 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---->动态的创建一个类

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 宣堡,又称宣家堡;在宣堡郊区,耸立着一个巍峨高大的牌匾刻着“宣家堡”;我的那个他用地道的方言告诉我,叫“宣嘎堡”。...
    三末阅读 500评论 0 1
  • 悶 很久沒感覺心情如此鬱悶了! 歸根到底,是傻傻地讓自己的心,淪陷進了一段或許完全無真實性可言的網路情。 雖然,我...
    Ching9036HSU阅读 177评论 2 1