美文网首页
KVC 和KVO

KVC 和KVO

作者: 星空WU | 来源:发表于2021-02-14 16:25 被阅读0次

    1) KVC 底层实现原理

    KVC运用了一个isa-swizzling技术。isa-swizzling就是类型混合指针机制。KVC主要通过isa-swizzling,来实现其内部查找定位的.

    一个对象在调用setValue的时候,(1)首先根据方法名找到运行方法的时候所需要的环境参数。(2)他会从自己isa指针结合环境参数,找到具体的方法实现的接口。(3)再直接查找得来的具体的方法实现。

    当一个对象调用setValue:forKey: 方法时,方法内部会做以下操作:

    1.判断有没有指定key的set方法,如果有set方法,就会调用set方法,给该属性赋值

    2.如果没有set方法,判断有没有跟key值相同且带有下划线的成员属性(_key).如果有,直接给该成员属性进行赋值

    3.如果没有成员属性_key,判断有没有跟key相同名称的属性.如果有,直接给该属性进行赋值

    4.如果都没有,就会调用 valueforUndefinedKey 和setValue:forUndefinedKey:方法、

    2)KVC 常用的方法


     KVC 的使用场景

    1) KVC 简单属性赋值

    使用setValue: forKey:方法能够给属性赋值,等价于直接给属性赋值

    2) KVC复杂属性赋值

    给person添加dog属性,并添加一个私有成员变量name2

    修改dog中的name属性

    修改p中的成员变量

    kvo 原理

    KVO是通过isa-swizzling技术实现的(这句话是整个KVO实现的重点)。在运行时根据原类创建一个中间类,这个中间类是原类的子类,并动态修改当前对象的isa指向中间类。并且将class方法重写,返回原类的Class。所以苹果建议在开发中不应该依赖isa指针,而是通过class实例方法来获取对象类型。

    手动调用KVO

    可以看到调用KVO主要依靠两个方法,在属性发生改变之前调用willChangeValueForKey:方法,在发生改变之后调用didChangeValueForKey:方法

    注意点:

    1、kvo的添加和移除要匹配出现,建议init中添加,dealloc中移除

    2、在调用KVO时需要传入一个keyPath,由于keyPath是字符串的形式,所以其对应的属性发生改变后,字符串没有改变容易导致Crash

    相关文章

      网友评论

          本文标题:KVC 和KVO

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