iOS 用什么方式实现对一个对象的KVO?
- 利用runtime api动态生成一个子类,并让对象的isa指针指向这个新生成的子类。
- 新生成的子类会重写setter方法,当外部调用setter方法修改属性时,会调用新的setter方法,其内部会调用
foundation
框架的_NSSetxxxValueAndNotify
函数,里面的xxx是属性的类型。- 该函数内部有以下调用:
willChangeValueForKey:
->父类原来的setter方法
->didChangeValueForKey:
- 在
didChangeValueForKey:
方法的内部会使属性的监听者们调用每个监听者的方法- (void)observeValueForKeyPath:ofObject:change:context:
。- 由上可知,如果是自己手动给成员变量赋值,不会调用到setter方法,也就不会触发KVO; 如果要手动触发KVO,需要自己手动调用
willChangeValueForKey:
和didChangeValueForKey:
方法,只调用后者是无效的
网友评论