KVO本质
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
kvo監(jiān)聽的原理是利用監(jiān)聽對象的set方法,但是如何才能監(jiān)聽的到對象內(nèi)部的set方法呢,如下圖
創(chuàng)建一個(gè)Person對象,給他添加觀察者,添加觀察者前它的isa指針指向的是Person類,接下來看添加后
添加觀察者后p對象的類型改變了,被系統(tǒng)替換成了NSKVONotifying_Person,
也就是說,系統(tǒng)創(chuàng)建了一個(gè)Person類的子類NSKVONotifying_Person替換原有對象,并在其內(nèi)部重寫了它的name 的set方法(同時(shí)也會(huì)調(diào)用它的super set方法),在里面添加了監(jiān)聽,所以每次改變name屬性,即調(diào)用set方法都會(huì)被監(jiān)聽到。然后再去通知觀察者
由此可見
被觀察者被系統(tǒng)替換成了子類。系統(tǒng)重寫了相應(yīng)的set方法實(shí)現(xiàn)監(jiān)聽
同時(shí)也需要注意,只有調(diào)用了set方法,才能被監(jiān)聽到,如果是直接改變內(nèi)部成員變量的值(_name = @""....)則不能被監(jiān)聽到,因?yàn)闆]有調(diào)用set方法。
?
轉(zhuǎn)載于:https://my.oschina.net/dahuilang123/blog/796394
總結(jié)
- 上一篇: 设计模式5 行为模式
- 下一篇: 润乾实现简单自定义动态列报表