KVO和KVC

作者: 东也_ | 来源:发表于2018-11-18 14:37 被阅读6次

    什么是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:方法。

    相关文章

      网友评论

        本文标题:KVO和KVC

        本文链接:https://www.haomeiwen.com/subject/hazwfqtx.html