iOS用什么方式实现对一个对象的KVO?(KVO的本质?)
NSKVONotifying_MJPerson
是使用Runtime动态创建的一个类,是MJPerson的子类
小技巧:lldb调试的时候根据方法地址可以打印方法的实现信息p (IMP) 0xxxxx
答案:
1、利用Runtime API动态生成一个子类,并且让instance对象的isa指向这个全新的子类
2、当修改instance对象的属性时,会调用Foundation的_NSSetValueAndNotify函数
- willChangeValueForKey:
- 父类原来的setter
- didChangeValueForKey:
内部会触发监听器(Oberserve)的监听方法(observerValueForKeyPath:ofObject:change:context:)
如何手动触发KVO?
属性值没有改变时,自己触发KVO
答案:在需要触发的地方重写方法
手动调用:willChangeValueForKey:和didChangeValueForKey:
直接修改成员变量会触发KVO吗?
答案:不会。
属性能不能监听取决于是否有set方法
通过KVC修改属性会触发KVO吗?
答案:会触发KVO。(没有set方法也是可以的)
KVC的赋值和取值的过程?原理是什么?
答案: