如何验证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失效了,这也是一个有力的佐证。

上一篇下一篇

猜你喜欢

热点阅读