KVC 和KVO

2021-02-14  本文已影响0人  星空WU

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

上一篇下一篇

猜你喜欢

热点阅读