iOS ---- KVO的內(nèi)部實現(xiàn)原理

Key-Value Observing (KVO)

KVO:當指定的對象的屬性被修改了,允許對象接收到通知的機制。

[persion addObserver : self forKeyPath : @"age" options : NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context : nil ];

只要當前類中 age 這個屬性發(fā)生的變化都會觸發(fā)到以下的方法

  • (void)observeValueForKeyPath:(NSString *)keyPath

ofObject:(id)object

change:(NSDictionary *)change

context:(void *)context

同時不要忘記在 dealloc中移除監(jiān)聽

-( void )dealloc{

[ self . persion removeObserver : self forKeyPath : @"age" ];

}

下面就來看看它的實現(xiàn)原理

QQ20160723-0.png
QQ20160723-1.png

通過上面圖片可以看出 當某個類第一次被監(jiān)聽時,系統(tǒng)會在運行時期動態(tài)地創(chuàng)建一個繼承XqPersion的NSKVONOtifying_XqPersion類

在這個派生類中,重寫基類中任何被觀察屬性的setter方法,在setter方法中實現(xiàn)真正的通知機制.

在該類中重寫了監(jiān)聽屬性的set方法,來通知監(jiān)聽器

  • (void)setAge:(int)age

{

[super setAge:age];

[堅聽器 observeValueForKeyPath:@"age" ofObject:self change:@{} context:nil];

}

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

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容