基本上中級(jí)別以上的面試都會(huì)問(wèn)到KVO的實(shí)現(xiàn)原理迁霎。
稍微做準(zhǔn)備就知道利用運(yùn)行時(shí)冈爹,自動(dòng)生成子類,重寫setter方法……
這是原理可以通過(guò)一篇博客來(lái)輕松搞定欧引,那么應(yīng)用呢?有下面這四個(gè)問(wèn)題
- 對(duì)成員變量直接賦值會(huì)響應(yīng)監(jiān)聽(tīng)嘛恳谎?
- 如果不實(shí)現(xiàn)
-observeValueForKeyPath:ofObject:change:context:
方法會(huì)怎么樣芝此? - 不移除監(jiān)聽(tīng)會(huì)怎么樣?
- 分類的屬性能否實(shí)現(xiàn)KVO因痛?
思考……
對(duì)成員變量直接賦值會(huì)響應(yīng)監(jiān)聽(tīng)嘛婚苹?
如果理解原理,這應(yīng)該能準(zhǔn)確回答鸵膏,不會(huì)響應(yīng)監(jiān)聽(tīng)膊升。如果不實(shí)現(xiàn)
-observeValueForKeyPath:ofObject:change:context:
方法會(huì)怎么樣?
答案是:crash
日志是:
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '<ViewController: 0x7fd1ffc05180>: An -observeValueForKeyPath:ofObject:change:context: message was received but not handled.
方法未實(shí)現(xiàn)嘛谭企!也很好理解廓译。
但是仔細(xì)想想,一定嘛债查?如果未檢測(cè)到值的改變自然不會(huì)crash非区,因?yàn)闆](méi)有去調(diào)用方法。
- 不移除監(jiān)聽(tīng)會(huì)怎么樣盹廷?
答案是: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>
)'
- 分類的屬性能否實(shí)現(xiàn)KVO征绸?
答案是:可以
理解原理自然就知道了
雖然很簡(jiǎn)單,還是寫了個(gè)demo驗(yàn)證上面的結(jié)論