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安全边距扩展视图
相关推荐
2501_915909064 小时前
iOS App 测试工具全景指南,构建从开发、性能到系统级调试的多工具协同测试体系
android·测试工具·ios·小程序·uni-app·iphone·webview
AskHarries4 小时前
RevenueCat 接入 Apple App Store 订阅全流程详解(2025 最新)
flutter·ios·app
ajassi20006 小时前
开源 Objective-C IOS 应用开发(十三)通讯--Http访问
ios·开源·objective-c
游戏开发爱好者86 小时前
Fiddler抓包工具完整教程 HTTPHTTPS抓包、代理配置与API调试实战技巧(开发者进阶指南)
前端·测试工具·ios·小程序·fiddler·uni-app·webview
m0_495562787 小时前
iOS的蓝牙
macos·ios·cocoa
songgeb7 小时前
[WWDC]Why is my app getting killed 学习笔记
ios
00后程序员张8 小时前
iOS 性能优化的体系化方法论 从启动速度到渲染链路的多工具协同优化
android·ios·性能优化·小程序·uni-app·iphone·webview
shanyanwt8 小时前
1分钟解决iOS App Store上架图片尺寸问题
前端·ios
blackorbird8 小时前
iOS 18-26 越狱关键突破:实现沙箱逃逸与权限提升
macos·ios·objective-c·cocoa
游戏开发爱好者88 小时前
iPhone重启日志深度解析与故障代码诊断
android·ios·小程序·https·uni-app·iphone·webview