参考:
iOS底层原理总结 - 探寻KVO本质
iOS-KVO本质
问题一:kvo如果找到对应的属性
- KVO不存在查找顺序问题,KVC才有一个查找顺序。
- KVO完成条件1:拥有成员属性_key
2:完成了setKey:方法的声明和实现 - KVO监听属性实际上是给成员变量_key添加了监听,然后在setKey:方法中去实现C语言的函数_NSSetIntValueAndNotify,完成回调;
- 监听的原理是监听setter方法。
问题二:kvo如何创建出NSKVONotifying_这个类
NSKVONotifying_Person是使用Runtime动态创建的一个新类,是原先类Person的一个子类,新类的superclass指向Person。
新类重写了四个方法:
- setKey: 实际上是调用了Foundation框架下的C语言的_NSSetIntValueAndNotify函数
- class 屏蔽内部实现,隐藏了NSKVONotifying_MJPerson类的存在,避免开发者疑惑
- dealloc 收尾工作
- _isKVOA 返回YES,是kvo的监听
思考的问题:
1.当属性设置为只读,
2.给成员变量添加监听
上述两种形式下都没有setter方法的声明和实现,如何调用c语言的_NSSetXXXValueAndNotify函数
通过kvc赋值,都可以触发监听
问题:kvc内部实现是什么样的。
kvc内部的确是有 __NSSetValueAndNotifyForKeyInIvar之类的调用,位于-[NSKeyValueIvarSetter initWithContainerClassIDcontainerIsa:ivar:],此外还有__NSKVONotifyingMutatorsShouldNotifyForIsaAndKey之类的函数,内部会获取_isKVOA的实现。
// 通过KVC修改age属性
[person setValue:@10 forKey:@"age"];
// [person willChangeValueForKey:@"age"];
// person->_age = 10;
// [person didChangeValueForKey:@"age"];
网友评论