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安全边距扩展视图
相关推荐
空中海8 小时前
第十二章:iOS高级系统能力与 UIKit 互操作
ios
songgeb15 小时前
用 AI 降低 iOS 客户端 UI 自动化测试难度
ios·测试
我现在不喜欢coding15 小时前
Swift 核心协议揭秘:从 Sequence 到 Collection,你离标准库设计者只差这一步
ios·swift
开心就好202516 小时前
使用Edge和ADB进行Android Webview远程调试的完整教程
前端·ios
开心就好202518 小时前
iOS应用上架全流程:从证书申请到发布避坑指南
后端·ios
梦想不只是梦与想19 小时前
flutter 与 Android iOS 通信?以及实现原理(一)
android·flutter·ios·methodchannel·eventchannel·basicmessage
冰凌时空21 小时前
30 Apps 第 1 天:待办清单 App —— 数据层完整设计
前端·ios
2501_9159090621 小时前
Xcode从入门到精通:全面解析iOS开发IDE的核心功能与实际应用指南
ide·vscode·ios·个人开发·xcode·swift·敏捷流程
懋学的前端攻城狮21 小时前
登录与注册:不止于UI,更关乎安全与用户体验的闭环
ios
卢锡荣1 天前
单芯双 C 盲插,一线通显电 ——LDR6020P 盲插 Type‑C 显示器方案深度解析
c语言·开发语言·ios·计算机外设·电脑