1:实例对象添加了 KVO
监听后, isa
指向的是拥有 NSKVONotfying_
前缀的子类对象(runtime
动态生成的)
2:NSKVONotfying
子类有自己的 set
方法实现,例如若是监听的属性是 Int
类型,set
方法的对应的内部实现就是一个_NSSetIntValueAndNotify()
。
[self willChangeValueForKey:@"age"]; [self setAge:age]; [self didChangeValueForKey:@"age"]复制代码
3:didChangeValueForKey
里面调用了监听方法(observeValueForKeyPath
)
4:NSKVONotfying
子类重写Class
方法的原因是隐藏NSKVONotfying
5:手动触发 KVO 需要调用 willChangeValueForKey
的原因是因为didChangeValueForKey
内部会判断willChangeValueForKey
是否被调用
6: setValue:forKeyPath
和setValue:forKey
的区别在于可以查找路径例如(dog.name
)
7 :setValue:forKey
会根据传进来的key
来查找方法,按顺序查找,首先会找setKey:
,然后再找_setKey:
8:
9:setValue:forKey
在找不到 set
方法的情况下会按_key
、_isKey
、key
、isKey
的顺序查找,如果找不到就抛出异常
10:KVC
肯定会触发 KVO
,KVC
内部会做willChangeValueForKey
和didChangeValueForKey
的操作
11:valueForKey:
的方法查找顺序是:getKey
,key
,isKey
,_key
。