如何验证KVO实现?
2019-04-08 本文已影响0人
往事不许提
很久之前的一次面试中,被问到:KVO是如何实现的?
然后原理相信大部分人都知道:
创建了一个被观察对象所属类的子类KVONotifying_A类,然后重写被观察属性的的setter方法,在赋值前调用NSObject的willChangeValueForKey方法,在赋值后调用NSObject的didChangeValueForKey方法,然后利用isa混写,这样调用class方法的时候,你会发现得到仍然是A,这样就隐藏了创建子类的事实。
面试官又问:你是如何知道的?如何验证的?
答:debug时,在调用栈中看到了`KVONotifying_A`这个类,然后就觉得应该和A有联系,然后查阅开发者文档看到的。可以通过打印所属类类名来验证。
但是面试官不置可否。
确实,直接通过[object class],获取到的仍是A,因为isa混写,但是通过 object_getClassName(object)就可以得到KVONotifying_A,可能这是当初没有说清楚的地方。
再者,我们可以创建一个名为KVONotifying_A的子类,然后发现KVO失效了,这也是一个有力的佐证。