一、KVO的本质(ios用什么方法实现对一个对象的KVO)
- 利用runtimeAPI动态生成一个子类,并且让instance的isa指针指向这个全新的子类
- 当修改instance对象的属性时,会调用Foundation的NSSetXXXValueAndNotify函数(int、double、、、)。
- 在NSSetXXXValueAndNotify函数内部会调用
1、willChangeValueForKey:
2、父类原来的setter函数
3、didChangeValueForKey:函数,在函数内部会触发监听器的监听方法(observeValueForKeyPath:ofObject:change:context:)
二、如何手动触发KVO
- 手动调用willChangeValueForKey:和didChangeValueForKey:方法。
- 注:在didChangeValueForKey:方法内部会判断是否调用了willChangeValueForKey:方法,如果调用了则会触发监听器的监听方法,否则不会触发,所以willChangeValueForKey:必须调用。
三、直接修改成员变量会出发KVO吗
- 不会触发KVO,但是可以手动调用willChangeValueForKey:和didChangeValueForKey:方法触发KVO
- 通过KVC直接给成员变量赋值会触发KVO
网友评论