iOS KVO底層實現

參考

ke.qq.com/course/3145…函數

KVO

KVO,俗稱「鍵值監聽」,能夠用於監聽某個對象屬性值的改變。對象

問題

1.新建一個Person類,設置一個age屬性。get

2.建立兩個Person的實例對象,對第一個Person實例對象的age屬性設置KVO進行監聽。io

3.打印設置監聽後的兩個Person實例對象的isa,發現第一個person對象的isa是NSKVONotifying_Person,第二個person對象的isa是Person。class

4.爲何第一個person對象的isa會被改變?變量

本質

KVO利用Runtime API動態生成一個子類,而且讓實例對象的isa指向這個全新的子類。 當修改實例對象的屬性時,會調用Foundation的_NSSetXXXValueAndNotify函數方法

1>willChangeValueForKeyim

2>調用父類的setqq

3>didChangeValueForKeydi

didChangeValueForKey內部會觸發監聽器的監聽方法(observeValueForKeyPath:ofObject:change:context:)

補充

1.如何手動觸發KVO?

手動調用willChangeValueForKey:和didChangeValueForKey:能夠觸發KVO。

2.直接修改爲員變量會觸發KVO麼?

直接給成員變量賦值,不通過set方法,是不會觸發KVO的。

3.本文若有侵犯隱私或其餘請聯繫我,我將在第一時間整改或刪除。

相關文章
相關標籤/搜索