博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
KVO和 KVC
阅读量:6486 次
发布时间:2019-06-23

本文共 830 字,大约阅读时间需要 2 分钟。

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:forKeyPathsetValue:forKey的区别在于可以查找路径例如(dog.name

7 :setValue:forKey会根据传进来的key来查找方法,按顺序查找,首先会找setKey:,然后再找_setKey:

8:

9:setValue:forKey在找不到 set方法的情况下会按_key_isKeykeyisKey的顺序查找,如果找不到就抛出异常

10:KVC 肯定会触发 KVO,KVC内部会做willChangeValueForKeydidChangeValueForKey的操作

11:valueForKey:的方法查找顺序是:getKey,key,isKey,_key

转载于:https://juejin.im/post/5bd1223151882528cf0a7edb

你可能感兴趣的文章
quzatz --Could not load org.quartz.spi.Trigge...
查看>>
qml实现窗口的拖拽效果
查看>>
Centos安装Mysql
查看>>
android Looper 非UI线程中更新UI
查看>>
js if语句多个条件判断
查看>>
AVPacketList结构体和AVPacketQueue结构体
查看>>
PHP操作redis详细讲解
查看>>
Android学习笔记(一)
查看>>
Java 提高篇(一)
查看>>
虚拟化学习笔记
查看>>
浏览器的兼容性问题
查看>>
我的友情链接
查看>>
今天真的搬走了
查看>>
PC散热风扇之研究一:风扇种类介绍
查看>>
关于Session和Cookie简单实例
查看>>
App框架实现———dagger2
查看>>
zabbix 微信报警
查看>>
通过SQL Server 2008数据库复制实现数据库同步备份
查看>>
HttpClient做接口测试时自定义参数长度
查看>>
PyCharm2017激活方法
查看>>