當咱們對A類添加監聽的時候,系統會自動生成一個NSKVONotifying_A的子類,這個類重寫了A的class、superclass、deealloc方法和該屬性的Set方法,同時A類的對象的isa指針指向了該虛擬子類。當監聽屬性改變的時候系統調用NSSetobjectValueandNotify,這個方法的執行流程是(willchangeValueforkey->改變父類的值->didchangeValueforkey->observeValueForKey:ofObject:change:context:),若是設置automaticallyNotifiesObserversForKey:(NSString *)key爲NO的時候則須要手動觸發KVO即手動調用willchangeValueforkey和didchangeValueforkey.html
func _NSSetObjectValueAndNotify {
...
willchangeValueforkey
...
" objc_msgSendSupper '改變父類的值(猜想這樣實現) "
...
didchangeValueforkey
...
observeValueForKey:ofObject:change:context:
}
複製代碼
由於該子類爲系統自動生成蘋果想假裝成並無這個類 因此重寫class/superclass ,可是調用 objc_getClass()這個方法時候依然會暴露,由於這個方法是調用調用對象的isa指針指向。dealloc則是系統還有一些其餘的事情處理數組
KVCKVC是由NSKeyValueCoding非正式協議實現的一種機制,對象採用該協議來提供對其屬性的間接訪問。當一個對象符合鍵值編碼時,它的屬性能夠經過一個簡潔、統一的消息傳遞接口經過字符串參數來尋址。這種間接訪問機制補充了實例變量及其關聯的訪問方法所提供的直接訪問。bash
set value:for key:的默認實現:給定key和value參數做爲輸入,嘗試在接收調用的對象內,使用如下過程將名爲key的屬性設置爲value(對於非對象屬性,則設置未包裝的value版本,如表示非對象值:app