很多人提到KVO的时候,就知道他是用来监听的。然后实现原理就是系统在后台默认创建子类。具体问道,创建子类的时候如何监听变化的 ,很多人就有点卡壳的,包括我自己也有过这个经历,所以我把这个原理简单的写下啦,给自己一个提醒
核心原理:
主要原理是在创建其子类的时候,把监听的对象的指针通过runtime指向了子类对象,当监听完成之后,又偷偷的把指针指向回来,说到底就是改变了指针的指向。
过程:
创建一个子类,并且父类的isa指向创建的子类,当监听的对象发生改变的时候,调用willchnageValue方法,然后再调用父类的setter ,最后调用 其didchangeValue方法。最后返回父类。单纯的调用willchnageValue与didchangeValue也是能触发监听的回调方法,但是没有改变值。因为此时没有实现其setter方法。
触发条件:
监听的对象或则属性具有setter属性并且执行setter方法,否则无法出KVO监听。
实际应用
实际在使用的时候,没有面试的时候问的那么复杂,需要主要的就是销毁监听。使用的地方挺多的,播放状态,网页加载进度等。
整体去看OC的特点,所有的东西都离不开指针,runtime的动态的原理其实就是对指针的操作。
最讨厌就是那些问底层的东西,自己百度来的题目,去问别人会不会,别人回答不上来,感觉自己特牛逼,我感觉这些东西其实就是自己学习的收获,应该用一个分享的态度去面试,如果你会的别人不会,告诉他,如果你不会的别人会,请教他,没什么大不了,面试的是态度,能力可以培养,放低姿态去交流,
这纯属自己的理解,如有错误,欢迎指正,因为我也需要学习。