随笔 - 91,  文章 - 0,  评论 - 4,  阅读 - 13万

KVO的实现原理:

KVO是键值监听,需要知道一个对象的属性的变化时做出相应。
用法:
1、添加监听addObserver  
2、当所观察的属性值发生改变时调用的函数observalue: ForKeyPath:
原理:
1、当添加了监听之后,对象的isa指针指向的是 NSKVONotifying_ 的一个类,NSKVONotifying_的super类是原先的类。
2、当值改变时,NSKVONotifying_ 方法里包含三步骤:1.willChangeValueForKey方法 2.改变属性值 3.didChangeValueForKey方法
3、在didChangeValueForKey里通知监听者属性已改变。
其他:
1、直接打印已添加监听的对象的类名是原对象的类名,需要用runtime的object_getClass()方法才能获取NSKVONotifying_ 类
2、直接获取类名获取不出来,是因为NSKVONotifying_ 重写了获取类名的方法,因为不想暴露NSKVONotifying_这个类
3、KVO的本质是set方法,直接修改成员变量不会触发KVO
4、手动触发KVO方法是调用willChangeValueForKey和didChangeValueForKey

KVC的实现原理:
KVC是键值编码,通过key来访问对象的属性,或者给对象的属性去赋值。
用法:
1、valueForKey: 获取值  setValue: forKey: 设置值
2、valueForKeyPath: 获取值  setValue: forKeyPath: 设置值  可以使用点语法更深入的获取或者设置值
原理:
1、valueForKey: 是使用getter方法搜索实例,如get<key>,<key>,is<key>,_<key>的拼接方案,搜索到了就返回这个结果。失败了就调用valueForUndefinedKey:方法并抛出异常
2、setValue:forKey: 是使用setter方法搜索实例,如set<key>:,_set<key>,_<key>,<key>,_is<key>,is<key>>的拼接方案,搜索到了就讲value赋值给实例变量。失败了则调用setValue:forUndefinedKey:方法并抛出异常。

posted on   xiao孛  阅读(513)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2016-02-14 ios 远程推送

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示