基本上中級別以上的面試都會問到KVO的實現原理。
稍微做準備就知道利用運行時,自動生成子類,重寫setter方法……
這是原理可以通過一篇博客來輕松搞定,那么應用呢?有下面這四個問題
- 對成員變量直接賦值會響應監聽嘛?
- 如果不實現
-observeValueForKeyPath:ofObject:change:context:
方法會怎么樣? - 不移除監聽會怎么樣?
- 分類的屬性能否實現KVO?
思考……
對成員變量直接賦值會響應監聽嘛?
如果理解原理,這應該能準確回答,不會響應監聽。如果不實現
-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,因為沒有去調用方法。
- 不移除監聽會怎么樣?
答案是: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>
)'
- 分類的屬性能否實現KVO?
答案是:可以
理解原理自然就知道了
雖然很簡單,還是寫了個demo驗證上面的結論