什么是KVO?
KVO是对OC对于观察者设计模式的实现
apple使用了isa混写(isa-swizzling)来实现KVO
KVO的实现机制
在对某个类(假如A类)的属性进行监听的时候,系统会动态创建一个继承A的类NSKVONotifying_A,并重写属性的setter方法。然后将A的isa指针指向NSKVONotifying_A,在对属性赋值完成的时候就会通知所有的观察者对象。
注意:使用点方法对象的属性赋值或者KVC都会调用setter方法,但是在对象的成员变量直接赋值是不会触发的,如果要想手动触发KVO必须在setter方法里面调用对象的两个方法willChangeValue和didChangeValue方法。
例如:
KVC
键值编码技术,主要使用两个方法:valueForKey,setObject:forKey。
valueFoeKey:的实现流程:
——判断对象是否存在get方法,如果存在直接获取值,结束流程。
——如果不存在,会去实例中查找是否有这个变量,如果有的话直接获取值,如果没有会调用实例的valueForUndefinedKey方法再抛出异常NSUndefinedKeyException 结束流程。
setObject:FoeKey:的实现流程:类似于valueForKey
注意:在使用这两个方法的时候,如果你的实例的属性没有实现getter/setter方法,并且又不想让别人通过这个两个方法操作你的属性,可以通过重写accessInstanceVariableDirectly方法返回NO达到保护的作用。如果这个时候再调用就会抛出异常调用当前对象的setValue:forUndefinedKey:方法。
网友评论