下面的原理仔細(xì)品嘗喔~多讀幾遍就可以理解了召边,當(dāng)然理解不了就按我說(shuō)的來(lái)點(diǎn) KVO 的代碼,最后都能理解
1.當(dāng)一個(gè) object(對(duì)象) 有觀察者時(shí)候,動(dòng)態(tài)創(chuàng)建這個(gè) object(對(duì)象) 的類的子類
2.對(duì)于每個(gè)被觀察的 property(屬性),重寫其 setter 方法
3.在重寫的 setter 方法中調(diào)用 -willChangeValueForKey: 和 -didChangeValueForKey: 通知觀察者
4.當(dāng)一個(gè) property(屬性) 沒(méi)有觀察者時(shí)凄贩,刪除重寫的方法
5.當(dāng)沒(méi)有 observer(觀察者) 觀察任何一個(gè) property(屬性) 時(shí),刪除動(dòng)態(tài)創(chuàng)建的子類
例如:創(chuàng)建Person類,創(chuàng)建一個(gè)age屬性,并監(jiān)聽這個(gè)屬性的值得變化
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;
//控制臺(tái)打印的結(jié)果:
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
因?yàn)?isa是一個(gè)Class 類型的指針. 每個(gè)實(shí)例對(duì)象有個(gè)isa的指針,他指向?qū)ο蟮念?根據(jù)這個(gè)指針很容易就會(huì)查到他所指的類,
所以NSKVONotifying_Person是Person類的子類,
因此:KVO機(jī)制動(dòng)態(tài)創(chuàng)建一個(gè)對(duì)象person當(dāng)前類的子類袱讹,并為這個(gè)新的子類重寫了被觀察屬性keyPath的setter 方法疲扎。setter 方法隨后負(fù)責(zé)通知觀察對(duì)象屬性的改變狀況---Objective-C 強(qiáng)大的 Runtime---->動(dòng)態(tài)的創(chuàng)建一個(gè)類