通过KVC修改属性会触发KVO么?
- 会触发
通过-_isKVOA
方法判定是否有监听器(_isKVOA
为KVO
生成的NSKVONotifying_XXX
的方法) - 内部实现:
-
[per willChangeValueForKey:@"age"];
保存旧值,标识等会调用didChangeValueForKey
- 执行
setter
方法,没有则直接对成员变量赋值:per->_age = 20;
-
[per didChangeValueForKey:@"age"];
通知监听器,XX属性值发生了改变
KVC的赋值和取值过程是怎样的?原理是什么?
- 赋值
-setValue:forKey:
的过程:
- 按照优先级为
-setKey:
、-_setKey:
的顺序查找方法
- 找到:传递参数,调用方法 - 找不到,查看
+accessInstanceVariablesDirectly
方法是否为YES
-NO
,不允许:抛出NSUnknownKeyException
异常
-YES
,允许,按照优先级为_key
、_isKey
、key
、isKey
的顺序查找成员变量
1) 找到:直接赋值
2)找不到:抛出NSUnknownKeyException
异常
PS:+accessInstanceVariablesDirectly:
是否允许访问成员变量,默认为YES
网友评论