【IOS開發(fā)基礎系列】KVO/KVC專題

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:官方文檔

Key-Value

Observing Done Right:官方 KVO 實現(xiàn)的缺陷

MAKVONotificationCenter:一個改良的Notification 實現(xiàn),托管在 GitHub 上

Friday Q&A?2009-01-23

深入淺出Cocoa 之動態(tài)創(chuàng)建類

深入淺出Cocoa之類與對象

(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)

https://blog.csdn.net/u014205968/article/details/78224820

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

相關閱讀更多精彩內容

友情鏈接更多精彩內容