KVO 和 KVC

~ KVO的本质?
在iOS中是观察者模式的一种表现。我们可以使用KVO让某个对象成为另外一个对象的监听者。当被监听对象的属性发生改变时,KVO就会通知监听者。KVO的是通过一种叫isa-swizzling的技术实现的。(类似runtime的method swizzling,runtime进行方法互换的一种黑魔法。)

~ KVO的底层实现
1.监听者调用监听的方法。
2.被监听者派生一个中间类。被监听对象的isa指针指向派生类
3.被监听的属性发生变化,由中间类触发监听通知(具体方式未知)。
4.监听者收到通知。触发observeValueForKey:ofObject:change:context:

~ 如何手动触发KVO?
手动调用willChangeValueForKey:和didChangeValueForKey:。

~ 直接修改成员变量会触发KVO么?,通过KVC修改属性会触发KVO么?直接修改成员变量不会触发KVO。
通过KVC修改属性会触发KVO。

~ KVC的原理?
KVC键值编码,可以直接通过key(字符串的名字)来间接访问属性的机制。可以在运行时动态地访问和修改对象的属性。而不是在编译时确定。

~ KVC的底层实现
当一个对象调用setValue forKey方法时,方法内部会做以下操作:
1.检查是否存在相应setkey的方法,如果存在,就调用set方法。
2.如果set方法不存在,就会查找与setkey相同名称并且带下划线的成员属性,如果有,则直接给成员属性赋值。
3.如果没有找到_key,就会查找相同名称的属性iskey,如果有就直接赋值。
4.如果还没找到,则调用valueForUndefinedKey:和setValue:forUndefinedKey:方法。

[iOS面试题库——KVC与KVO]
(https://blog.csdn.net/yuwuchaio/article/details/80701681)

你可能感兴趣的:(KVO 和 KVC)