KVC&KVO面试题
人生就是一场战斗
KVC(Key-Value Coding)键值编码
1.1如何调用私有变量?如何修改系统的只读属性?KVC的查找顺序?
KVC在某种程度上提供了访问器的替代方案。但访问器是个很好的东西,以至于KVC在都会在访问器存在的情况下使用访问器实现存取值。
待精深理解
为了设置或者返回对象属性,KVC按顺序使用如下技术:
①检查是否存在-<key>、-is<key>(只针对布尔值有效)或者-get<key>的访问器方法,如果有可能,就是用这些方法返回值;
检查是否存在名为-set<key>:的方法,并使用它做设置值。对于 -get<key>和 -set<key>:方法,将大写Key字符串的第一个字母,并与Cocoa的方法命名保持一致;
②如果上述方法不可用,则检查名为-_<key>、-_is<key>(只针对布尔值有效)、-_get<key>和-set<key>:方法;
③如果没有找到访问器方法,可以尝试直接访问实例变量。实例变量可以是名为:<key>或<key>;
④如果仍为找到,则调用valueForUndefinedKey:和setValue:forUndefinedKey:方法。这些方法的默认实现都是抛出异常,我们可以根据需要重写它们。
1.2什么是键-值,什么是键路径?
模型的性质是通过一个简单的键(通常是个字符串)来指定的。视图和控制器通过键来查找相应的属性值。在一个给定的实体中,同一个属性的所有值具有相同的数据类型。键-值编码技术用于进行这样的查找—它是一种间接访问对象属性的机制。
键路径是一个由用点作分隔符的键组成的字符串,用于指定一个连接在一起的对象性质序列。第一个键的性质是由先前的性质决定的,接下来每个键的值也是相对于其前面的性质。键路径使您可以以独立于模型实现的方式指定相关对象的性质。通过键路径,您可以指定对象图中的一个任意深度的路径,使其指向相关对象的特定属性。
1.3什么是KVC?什么是KVO?
KVC内部实现:一个对象调用setValue的时候:1首先根据方法名找打运行方法所需要的环境参数。2他会从自己isa指针结合环境参数,找到具体的方法实现的接口。3再直接查找得来的具体的方法实现。
KVO内部实现:当为某一个对象属性注册监听的时候,该对象的isa指针就会指向一个中间类,而不是本来对象真实的类。所以说,对象的isa指针可以改变,我们的程序最好不要依赖isa指针。
1.4KVO的实现机制?
当某个类的对象在第一次被观察时,系统会在运行时动态创建一个该类的派生类,在该派生类中重写setter方法真正实现通知机制;派生类重写了 class 方法以“欺骗”外部调用者它就是起初的那个类。然后系统将这个对象的isa指针指向这个新诞生的派生类,因此这个对象就成为该派生类的对象了,因而在该对象上对setter的调用就会调用重写的setter,从而激活键值通知机制。此外,派生类还重写了dealloc方法来释放资源。
1.5KVO的使用场景
KVO用于监听对象属性的改变。
1下拉刷新、下拉加载监听UIScrollView的contentoffsize;
2webview混排监听contentsize;
3监听模型属性实时更新UI;
4监听控制器frame改变,实现抽屉效果。
感谢@zzz。