1.KVO概念
KVO即鍵值觀察,它提供一種機(jī)制鱼喉,當(dāng)被觀察的對(duì)象的屬性發(fā)生改變后秀鞭,對(duì)象會(huì)接收到通知趋观,從而做出相應(yīng)的改變。
2.KVO實(shí)現(xiàn)原理
每一個(gè)對(duì)象都有一個(gè)isa指針锋边,這個(gè)對(duì)象根據(jù)isa指針去尋找它所歸屬的類(具體可看我的這一篇文章[http://www.reibang.com/p/a894d5968ac1] )皱坛,當(dāng)我們給一個(gè)對(duì)象注冊(cè)觀察者的時(shí)候,系統(tǒng)會(huì)在運(yùn)行時(shí)給這個(gè)對(duì)象創(chuàng)建一個(gè)子類豆巨,這個(gè)子類繼承于當(dāng)前對(duì)象歸屬的類剩辟,并把當(dāng)前對(duì)象的isa指針指向這個(gè)子類,于是當(dāng)前對(duì)象就變成了這個(gè)子類的一個(gè)實(shí)例往扔。那么這個(gè)子類內(nèi)部做了什么操作呢贩猎?其實(shí)這個(gè)子類重寫了set方法,當(dāng)原對(duì)象在調(diào)用set方法賦值的時(shí)候萍膛,會(huì)根據(jù)isa指針到新建子類的方法列表去尋找set方法的IMP吭服,此時(shí)這個(gè)重寫的set方法會(huì)對(duì)所有觀察這個(gè)屬性的對(duì)象發(fā)出通知,于是原有的對(duì)象會(huì)作出改變蝗罗。
KVO鍵值觀察依賴于NSObject的兩個(gè)方法:willChangeValueForKey和didChangevlueForKey艇棕,即在鍵值改變前后分別調(diào)用這兩個(gè)方法,然后在這兩個(gè)方法的中間調(diào)用父類set方法賦值串塑。
3.KVO的特點(diǎn)
由于KVO內(nèi)部實(shí)現(xiàn)的原理是重寫了set方法沼琉,因此只有當(dāng)被觀察對(duì)象的屬性調(diào)用set方法賦值的時(shí)候才會(huì)執(zhí)行KVO的的回調(diào)方法。所以如果直接對(duì)屬性的成員變量直接賦值那么不會(huì)觸發(fā)KVO桩匪。
4.KVO的調(diào)用步驟
1.注冊(cè)觀察者
2.在回調(diào)方法中處理事件
3.移除觀察者
5.代碼實(shí)踐
self.changeStr = @"您好";
[self addObserver:self forKeyPath:@"changeStr" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
self.changeStr = @"大家都好";
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
NSLog(@"被改變的屬性是%@",keyPath);
NSString *str = [change objectForKey:NSKeyValueChangeNewKey];
NSString *odlStr = [change objectForKey:NSKeyValueChangeOldKey];
NSLog(@"舊屬性是%@",odlStr);
NSLog(@"新屬性是%@",str);
}
輸出結(jié)果: