iOS 中 KVC 与 KVO 底层原理

KVC

本质:

objc 复制代码
[object setValue: forKey:];


即使没有在.h 文件中有@property 的属性声明,setValue:forKey依然会按照上图流程执行代码
KVC 如果成功改变了成员变量,是一定可以被 KVO 监听到成员变量的前后改变的

KVO

  • runtime会生成中间类:NSKVONotifying_类名
  • 修改原来实例isa指向
    实例isa指向 NSKVONotifying_类名
    NSKVONotifying_类名 的isa 指向 class
  • 属性监听与改变
    • 直接修改成员值时,KVO是无能为力的
      kvo只能监听具有setProperty的属性
    • runtime调用Fundation内部函数_NSSet数据类型(Int)ValueAndNotify。代码实现逻辑:
      1. 生成属性的set方法
      2. willChangeValueForKey:属性
      3. super set属性方法,修改 _属性 的值
      4. didChangeValueForKey:属性,此时调用监听器,通知外界属性改变。
        [observer observeValueForKeyPath...]
  • 应用场景
    • 给webView添加加载进图条

      self.wkWebView addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew context:nil\];

      监听contentSize,在contentInset安全边距扩展视图
相关推荐
SY.ZHOU13 小时前
移动端架构体系(四):View层的组织与调用方案
flutter·ios·架构·系统架构·安卓
inxx16 小时前
iOS 26 模拟器启动卡死:Method Swizzling 在系统回调时触发 nil 崩溃
ios
Swift社区17 小时前
鸿蒙 vs iOS / Android:谁更适合 AI?
android·ios·harmonyos
亘元有量-流量变现17 小时前
ASO优化全流程实操指南:从基础到迭代,精准提升App曝光与转化
android·ios·harmonyos·aso优化·方糖试玩
zhangjikuan8918 小时前
iOS屏幕适配方案
ios
tangweiguo030519871 天前
SwiftUI布局完全指南:从入门到精通
ios·swift
T1an-12 天前
最右IOS岗一面
ios
坏小虎2 天前
Expo 快速创建 Android/iOS 应用开发指南
android·ios·rn·expo
光影少年2 天前
Android和iOS原生开发的基础知识对RN开发的重要性,RN打包发布时原生端需要做哪些配置?
android·前端·react native·react.js·ios
北京自在科技2 天前
Find My 修复定位 BUG,AirTag 安全再升级
ios·findmy·airtag