iOS KVO,KVC
KVO
1.KVO 是一种观察者设计模式,是利用 isa 混写机制来实现 KVO 的。
当我们要观察类A中的某个属性变化的时候,系统会为我们创建一个 NSKVONotifying_A 的类,然后将原来的 isa 指针,指向这个类,重写 setter 方法,达到通知的效果
2.重写的 setter 方法,添加两个方法 willChangeValueForKey
和 didChangeValueForKey
通过kvc 的 setValue forKey
方法,也可以生效,因为调用这个方法会走到setter方法,而setter方法已经被系统重写,所以会生效.
3.通过成员变量的直接赋值,_age=1;是不会触发KVO的,但前后加上 willChangeValueForKey
和 didChangeValueForKey
,是可以触发的,手动 KVO 其实就是加上 这两个实现的,did 方法会触发回调。
总结:
1:使用 setter 方法改变值 kvo 会生效
2:使用 setvalue:forKey 改变值,kvo 会生效
3:成员变量直接修改会,需要手动添加两个方法才会触发
KVC
KVC:键值编码技术
valueForKey:
会先判断这个实力变量是否有相应的get方法,如果不存在,会判断,实例变量是否存在,会给一个方法开关 + (BOOL)accessInstanceVariablesDirectly
,如果返回 NO ,即使同名的实例变量存在,也无法获得,如果YES,直接返回值,如果还不存在,会调用 - (id)valueForUndefinedKey:(NSString *)key
,抛出异常。
1.value 查找访问器(accessoriesMethod):
1.getKey
2.key
3.isKey
如果存在这三个方法会认为访问器存在
2.成员变量名字
1._key
2:_isKey
3:key
4:isKey
认为实例变量存在
setValueForKey:
会上面一样,会先判断是否有setter方法,有的话直接设置,没有的话,会判断是否有实例变量,如果还没有,调用- (void)setValue:(id)value forUndefinedKey:(NSString *)key
跑出异常,如果有直接对这个成员变量赋值,结果流程
网友评论