KVO的本質

1、如果你給一個Person實例添加KVO,那么這個實例的的isa指針指向的是派生出來了NSKVONotification_Person類對象,折耳根類對象是Runtime動態(tài)創(chuàng)建出來的,只要添加了KVO就會創(chuàng)建,他只是Person的一個子類,NSKVONotification_Person的superclass指向的還是Person這個類

2、NSKVONotification_Person中重寫了你監(jiān)聽屬性的set方法,這個set方法調用了NSSetInt(XXX類型而已)ValueAndNotify方法

3、NSSetInt(XXX類型而已)ValueAndNotify方法的實現(xiàn)

[self willChangeValueForKey];

[super setAge:age];//調用父類的set方法

[self didChangeValueForKey];

4、didChangeValueForKey 這個方法會調用監(jiān)聽起的observeValueForkeyPath方法

5、派生類NSKVONotification_Person中除了有重寫setAge方法,還有dealloc? classs? _isKVO 方法

KVO的本質

1、利用Runtime給對象的類添加一個NSKVONotification_XXX的派生類,并且讓這個實例對象的isa指針指向這個派生類

2、當被監(jiān)聽的屬性發(fā)生改變時,會通過實例的isa指針找到這個派生類,調用派生類里面的set方法

3、派生類中的set方法調用了NSSetXXXValueAndNotify方法

4、NSSetXXXValueAndNotify這個方法中又調用了

willChangeValueForKey

[super setXXX:]

didChangeValueForKey;

5、didChangeValueForKey中又調用了observer的observerValueForKeyPayh方法

手動觸發(fā)KVO

可以自己手動調用willChangeValueForKey 和 didChangeValueForKey

直接誒修改成員變量的值(person->age = 10),是不會掉用KVO的,因為沒有調用set方法,如果你要能夠監(jiān)聽到KVO,那么你需要手動調用willChangeValueForKey 和?didChangeValueForKey

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

相關閱讀更多精彩內容

  • 面試問題: iOS用什么方式實現(xiàn)對一個對象的KVO? 如何手動觸發(fā)KVO? KVO簡介 KVO就是鍵值觀測。有時候...
    雪山飛狐_91ae閱讀 4,728評論 10 36
  • KVC/KVO實現(xiàn)的根本是Objective-C的動態(tài)性和runtime動態(tài)運行時isa-swizzling方法 ...
    三秋樹下閱讀 400評論 0 0
  • 問題 iOS用什么方式實現(xiàn)對一個對象的KVO?(KVO的本質是什么?) 如何手動觸發(fā)KVO ? 首先需要了解KVO...
    hjltony閱讀 630評論 0 2
  • KVC KVC定義 KVC(Key-value coding)鍵值編碼,就是指iOS的開發(fā)中,可以允許開發(fā)者通過K...
    暮年古稀ZC閱讀 2,295評論 2 9
  • 夜深悠悠冥想, 月半切切思量, 天也茫茫, 心也茫茫 望斷遙眺水一方, 吶頭像在手機靜躺, 天漸深在天邊遠望, 它...
    e74a8d4d7c2f閱讀 310評論 0 1

友情鏈接更多精彩內容