1????KVO底層實現(xiàn)機制
截取自:
(Good)KVO的用法、底層實現(xiàn)原理
https://www.cnblogs.com/junhuawang/p/5802325.html
? ? ?KVO的實現(xiàn)是基于runtime運行時的,下面就來詳細介紹一下原理:

? ? ??當某個類的對象第一次被觀察時,系統(tǒng)就會在運行期動態(tài)地創(chuàng)建該類的一個派生類,在這個派生類中重寫基類中任何被觀察屬性的setter?方法。
? ? ??派生類在被重寫的setter?方法中實現(xiàn)真正的通知機制,就如前面手動實現(xiàn)鍵值觀察那樣。這么做是基于設置屬性會調用setter?方法,而通過重寫就獲得了KVO?需要的通知機制。當然前提是要通過遵循KVO?的屬性設置方式來變更屬性值,如果僅是直接修改屬性對應的成員變量,是無法實現(xiàn)KVO?的。
? ? ??同時派生類還重寫了class?方法以“欺騙”外部調用者它就是起初的那個類。然后系統(tǒng)將這個對象的isa?指針指向這個新誕生的派生類,因此這個對象就成為該派生類的對象了,因而在該對象上對setter?的調用就會調用重寫的setter,從而激活鍵值通知機制。此外,派生類還重寫了dealloc?方法來釋放資源。
2開發(fā)技巧
2.1 常見問題
2.1.1 kvo通知沒有發(fā)出來問題
KVO通知發(fā)起機制:
?????? KVO中屬性變化后,通知的發(fā)出是在屬性的setter方法中發(fā)起的,所以屬性賦值時,一定要用.操作符或者用方法調用,而不能直接用內部成員賦值的方法。
WS(weakSelf);
[HJComInstance getEntity:_entity WithUserEntity:userEntity WithCompleteBlock:^(HJResultData*reData){
??? HJPreEntity*preEntity;
??????????? if (reData.errCode == HJCode_Success) {
??????????????? preEntity = reData.resultData;
??????????? }
? ? ? ? ? ? if(preEntity) {
??????????????? weakSelf.preType = HJPreType_Done;
??????????????? //不會發(fā)出kvo通知
??????????????? _preType = HJPreType_Done;
??????????? }
}];
通知接收邏輯:
//添加對praiseType屬性的監(jiān)聽
[self.mEntity addObserver:self forKeyPath:@"preType" options:NSKeyValueObservingOptionNew context:nil];
#pragma mark 重寫observeValueForKeyPath方法,當屬性變化后此處獲得通知
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void*)context{
??? if([keyPath isEqualToString:@"preType"]){、
??????? if (object == _mEntity) {
??????????? [self loadSubViews];
??????? }
??? }
}
- (void)dealloc
{
??? [self.mEntity removeObserver: self forKeyPath:@"preType"];
}
3 參考鏈接
iOS開發(fā)系列--Objective-C之KVC、KVO
http://www.cnblogs.com/kenshincui/p/3871178.html
KVOController
https://github.com/facebook/KVOController
iOS:KVO的概述與使用
http://blog.csdn.net/yuquan0821/article/details/6646400
[深入淺出Cocoa]詳解鍵值觀察(KVO)及其實現(xiàn)機理
http://blog.csdn.net/kesalin/article/details/8194240
Key-value observing:官方文檔
Observing Done Right:官方 KVO 實現(xiàn)的缺陷
MAKVONotificationCenter:一個改良的Notification 實現(xiàn),托管在 GitHub 上
Friday Q&A?2009-01-23
(Good)KVO的用法、底層實現(xiàn)原理
https://www.cnblogs.com/junhuawang/p/5802325.html
KVO詳解及底層實現(xiàn)
http://www.itdecent.cn/p/cf079e5433e4
如何自己動手實現(xiàn)KVO
https://tech.glowing.com/cn/implement-kvo/
KVO?正確使用姿勢進階及底層實現(xiàn)