日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

KVC、KVO实现过程

發布時間:2025/3/15 c/c++ 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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实现过程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。