最近一直有小伙伴問我kvo基于運行時的一些底層原理罢吃,覺得有必要寫點東西記錄一下孤荣。所謂KVO止后,即:Key-Value Observing,它提供一種機制葛虐,當指定的對象的屬性被修改后胎源,則其觀察者就會接受到通知。簡單的說就是每次指定的被觀察的對象的屬性被修改后挡闰,KVO就會自動通知相應(yīng)的觀察者了乒融。KVO其實也是“觀察者”設(shè)計模式的一種應(yīng)用。這種模式有利于兩個類間的解耦合摄悯,尤其是對于 業(yè)務(wù)邏輯與視圖控制 這兩個功能的解耦合赞季。KVO 的具體實現(xiàn)具體實現(xiàn)代碼如下:
當改變被觀察對象person的值時,觀察者Viewcontroller會調(diào)用相應(yīng)觀察者方法
KVO 的實現(xiàn)原理
KVO 是基于運行時實現(xiàn)的
isa Class NSKVONotifying_Person?
上述例子中奢驯,如上圖申钩,當 p1.name 的值改變時,p1對象的 isa 指針會指向 NSKVONotifying_Person(這里我喜歡稱之為中間類)瘪阁,意味著撒遣,在程序運行時,會動態(tài)生成一個 NSKVONotifying_Person 類管跺,該類繼承于 Person义黎,而且該類中也有個 -setName: 方法,方法中在設(shè)置 name 的同時實現(xiàn)了:
- (void)setName:(NSString *)name
{
[super setName:name];
// 這兩個方法底層會調(diào)用observer的- (void)observeValueForKeyPath: ofObject: change: context:這個方法
[self willChangeValueForKey:@"age"];
[self didChangeValueForKey:@"age"];
}
至此kvo基于運行時的實現(xiàn)已經(jīng)不再神秘豁跑。廉涕。。更加詳細的剖析艇拍,會在大伙有需求的時候再來做總結(jié)