KVC、KVO实现过程
?
1.KVC的實現過程
以?[object setValue:@"134567" forKey:@"uid"];為例子,來探究KVC的實現過程
第一步:搜索
1、首先搜索setKey:方法.(key指成員變量名, 首字母大寫)
2、上面的setter方法沒找到, 如果類方法accessInstanceVariablesDirectly返回YES. 那么按 _key, _isKey,key, iskey的順序搜索成員名.(NSKeyValueCodingCatogery中實現的類方法, 默認實現為返回YES)
3、如果沒有找到成員變量, 調用setValue:forUnderfinedKey:
第二步:編譯器處理
被編譯器處理后:
// 首先找到對應sel
SEL sel = sel_get_uid("setValue:forKey:");
// 根據object->isa找到sel對應的IMP實現指針
IMP method = objc_msg_lookup (object->isa,sel);
// 調用指針完成KVC賦值
method(object, sel, @"134567", @"uid");
解釋:
1.先根據方法名通過C函數sel_get_uid拿到選擇子sel
2.使用C函數objc_msg_lookup通過對象指針,選擇子獲取函數實現指針
3. 調用C函數method(object, sel, @"134567", @"uid"),實現KVC賦值
2.KVO的實現過程
第一步:調用KVC方法
KVO若有起作用,首先要先調用KVC方法:
[self.object addObserver:self forKeyPath:@"uid" options:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew context:nil];
第二步:實現KVO后,系統相應的處理
系統實現KVO有以下幾個步驟:
1.當類A的對象第一次被觀察的時候,系統會利用運行時動態創建與類A一樣的NSKVONotifying_A派生類, 并且只有1個屬性的get, set方法實現.
2.在派生類NSKVONotifying_A中重寫類A的setter方法,NSKVONotifying_A類在被重寫的setter方法中實現通知機制。
3.類NSKVONotifying_A重寫會 class方法,將自己偽裝成類A。類NSKVONotifying_A還會重寫dealloc方法釋放資源。
4.系統將所有指向類A對象的isa指針指向類NSKVONotifying_A的對象。
?
參考文章:
KVC, KVO 實現原理:http://www.cnblogs.com/MrTao/p/5825457.html
轉載于:https://www.cnblogs.com/zhou--fei/p/6946968.html
總結
以上是生活随笔為你收集整理的KVC、KVO实现过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度学习之神经网络的结构
- 下一篇: 20155117王震宇 2006-200