当前位置: 首页 > news >正文

iOS 中 KVC 与 KVO 底层原理

KVC

本质:

[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];
    • 给ScrollView底部添加公共视图
      监听contentSize,在contentInset安全边距扩展视图

http://www.mrgr.cn/news/33739.html

相关文章:

  • HarmonyOS SDK下的实践与探索
  • C++20 概念与约束(1)—— SFINAE
  • Linux kernel 堆溢出利用方法(二)
  • 生产模式打包
  • 二叉树(C 语言)
  • 新日撸java三百行` 新手小白java学习记录 `Day1
  • 面试题(二)
  • Java--File
  • 【详细解答】指出下面指令的错误:IN AL,300H
  • 2024年 5 个优秀的Flutter图标库
  • CSS 选择器的分类与使用要点二
  • linux中vim编辑器的应用实例
  • 在Spring Boot中实现多环境配置
  • weak_from_this
  • 信息安全技术基础知识
  • vscode 顶部 Command Center,minimap
  • RuntimeError: Maximum Recursion Depth Exceeded - 递归深度超限的完美解决方案
  • uniapp自定义Tabbar教程
  • [Redis] 渐进式遍历+使用jedis操作Redis+使用Spring操作Redis
  • 【机器学习】12-决策树1——概念、特征选择
  • 内网穿透out了?黑群晖+IPv6+NAS公网助手的访问体验
  • 强大的重命名工具 | Bulk Rename Utility v4.0 便携版
  • Integer 源码记录
  • Web Components之继承
  • K8s容器运行时,移除Dockershim后存在哪些疑惑?
  • 局部凸空间及其在算子空间中的应用之四——归纳极限空间2