KVO,面試中遇到的四個問題

基本上中級別以上的面試都會問到KVO的實現原理。
稍微做準備就知道利用運行時,自動生成子類,重寫setter方法……

這是原理可以通過一篇博客來輕松搞定,那么應用呢?有下面這四個問題

  1. 對成員變量直接賦值會響應監聽嘛?
  2. 如果不實現-observeValueForKeyPath:ofObject:change:context:方法會怎么樣?
  3. 不移除監聽會怎么樣?
  4. 分類的屬性能否實現KVO?

思考……

  1. 對成員變量直接賦值會響應監聽嘛?
    如果理解原理,這應該能準確回答,不會響應監聽。

  2. 如果不實現-observeValueForKeyPath:ofObject:change:context:方法會怎么樣?
    答案是:crash
    日志是:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '<ViewController: 0x7fd1ffc05180>: An -observeValueForKeyPath:ofObject:change:context: message was received but not handled.

方法未實現嘛!也很好理解。
但是仔細想想,一定嘛?如果未檢測到值的改變自然不會crash,因為沒有去調用方法。

  1. 不移除監聽會怎么樣?
    答案是:crash
    日志是:
2017-03-16 16:07:30.528 KVODemo[9836:512230] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'An instance 0x60000001b330 of class Person was deallocated while key value observers were still registered with it. Current observation info: <NSKeyValueObservationInfo 0x600000036e80> (
<NSKeyValueObservance 0x60000004e250: Observer: 0x7fd1cc0011f0, Key path: name, Options: <New: YES, Old: NO, Prior: NO> Context: 0x0, Property: 0x60000004f660>
<NSKeyValueObservance 0x60000004f9f0: Observer: 0x7fd1cc0011f0, Key path: age, Options: <New: YES, Old: NO, Prior: NO> Context: 0x0, Property: 0x60000004fab0>
)'
  1. 分類的屬性能否實現KVO?
    答案是:可以
    理解原理自然就知道了

雖然很簡單,還是寫了個demo驗證上面的結論

https://github.com/lych0317/KVODemo

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 寫在前面 程序設計語言中有各種各樣的設計模式(pattern)和與此對應的反設計模式(anti-pattern),...
    Frankxp閱讀 4,966評論 0 23
  • KVO 的基本概念(Key Value Observing) 基本概念鍵值觀察是一種使對象獲取其他對象的特定屬性變...
    生如夏花逝如秋葉閱讀 1,296評論 0 1
  • KVO 作為 iOS 中一種強大并且有效的機制,為 iOS 開發者們提供了很多的便利;我們可以使用 KVO 來檢測...
    JzRo閱讀 974評論 0 2
  • 【原】iOS下KVO使用過程中的陷阱KVO,全稱為Key-Value Observing,是iOS中的一種設計模式...
    nadou23閱讀 1,984評論 0 0
  • 離鏡和天空的交相輝映, 色彩竟然是和諧,不是破碎的痛苦,而是一種像冰面般的空靈純凈。 非原創,找不到作者,分享于此。
    木咸閱讀 286評論 2 1