iOS --- KVO

KVO 的底層實現(xiàn)原理

(1)KVO 是基于 runtime 機制實現(xiàn)的

(2)假如有個對象DoLin(類型為Dog), 其屬性name發(fā)生變化時,系統(tǒng)會自動生成一個繼承Dog的類,NSKVONotifying_類名,次例為NSKVONotifying_Dog, 在這個類的setName方法中調用3個方法:

?[super setName:name];?

[self willChangeValueForKey:@"name"];?

[self didChangeValueForKey:@"name"];?

后面兩個方法內部會主動調用;

(3)方法回調

-(void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary?*)change context:(void*)context;

根據(jù)此方法的返回做UI刷新等操作。

?KVO的作用:

- (void)viewDidLoad {

? ? [super viewDidLoad];

? ? Dog*d1 = [[Dogalloc]init];

? ? d1.name? =@"DoLin";

[d1 addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:@"123"];//@"123"是隨意寫入的,如果很多不同的模型需要用到KVO, 可寫入不同值用于區(qū)分,否則,寫nil即可。

}

/**

*? 利用KVO 監(jiān)聽到對象屬性值改變后,就會調用這個方法

*

*? @param keyPath 哪一個屬性被改了

*? @param object? 哪一個對象的屬性被改了

*? @param change? 改成什么樣了

*/- (void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void*)context{

// NSKeyValueChangeNewKey == @"new"

NSString*new = change[NSKeyValueChangeNewKey];

// NSKeyValueChangeOldKey == @"old"

NSString*old = change[NSKeyValueChangeOldKey];NSLog(@"%@-%@",new,old);}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容