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

iOS 消息机制详解

应用

解决NSTimer、CADisplayLink循环引用。
二者都是基于runloop的定时器,由于处理事件内容不一样,runloop 每运行一次运行耗时就不一样,无法准确的定时触发timer的事件。

NSProxy 与 NSObject

如果继承自NSProxy

直接开始消息转发,NSProxy 是没有父类的。
继承NSProxy的类,调用isKindOfClass,会返回true,消息转发会用 target 本身做判断
在这里插入图片描述

如果继承自NSObject

isa 查找

isa 在当前类的方法缓存、方法列表中,找不到方法实现时,如果存在继承,会借助superclass寻找父类的方法缓存、方法列表中,找方法实现。

动态解析阶段

在这里插入图片描述
本质是调用了 objc_msgSend()
如果 isa 找到最后,找到原类还是找不到方法实现,就进入动态解析阶段。
此时,系统会再次通过 isa ,从类对象或者原类对象依次查找以下两个方法的实现:

+ (BOOL)resolveInstanceMethod:(SEL)sel // 对应实例方法
+ (BOOL)resolveClassMethod:(SEL)sel // 对应类方法

对应 runtime 源码:
在这里插入图片描述
举例:
在这里插入图片描述
在这里插入图片描述

消息转发阶段

继承自 NSObject 的情况下,如果动态解析阶段依然找不到方法实现,则进入消息转发阶段。
将消息转发给能处理消息的对象或者类

  • 类方法
+ (id)forwardingTargetForSelector:(SEL)aSelector
+ (void)forwardInvocation:(NSInvocation *)anInvocation
  • 对象方法
- (id)forwardingTargetForSelector:(SEL)aSelector
- (void)forwardInvocation:(NSInvocation *)anInvocation
http://www.lryc.cn/news/446639.html

相关文章:

  • 深入理解Spring Data JPA与接口编程
  • Wireshark学习使用记录
  • OpenCV特征检测(9)检测图像中直线的函数HoughLines()的使用
  • 力扣 中等 445.两数相加 II
  • 华为云徐峰:AI赋能应用现代化,加速软件生产力跃升
  • C发送邮件技巧:如何批量发送个性化邮件?
  • 基于python+spark的外卖餐饮数据分析系统设计与实现(含论文)-Spark毕业设计选题推荐
  • 权限维持——Linux
  • 申请SSL证书闭坑方法
  • linux 下域名解析错误
  • 基于单片机的角度、水位、温度、辅助热源、电机仿真
  • 泛函分析精解【1】
  • 大数据毕业设计选题推荐-租房数据分析系统-Hive-Hadoop-Spark
  • 有关shell指令练习2
  • Exception与Error:Java中的异常处理
  • HashMap哈希表练习
  • 字节豆包C++一面-面经总结
  • 极狐GitLab 17.4 重点功能解读【三】
  • 【unity进阶知识4】封装unity协程工具,避免 GC(垃圾回收)
  • Source insight安装使用笔记
  • golang学习笔记29——golang 中如何将 GitHub 最新提交的版本设置为 v1.0.0
  • Netty源码解析-锁机制
  • 【C/C++】initializer_list
  • 不要再混淆啦!一文带你学会原型链继承、构造函数继承、寄生组合继承、ES6继承
  • 828华为云征文|华为云Flexus X实例Windows Server 2019安装护卫神防火墙——为企业运维安全发挥重要作用!!!
  • 最新的iOS 18版本和Android 15版本系统分别升级了哪些功能?
  • window系统DockerDesktop 部署windows容器
  • CSDN文章导出md并迁移至博客园
  • 计算机组成原理(笔记5原码和补码的乘法以及直接补码阵列乘法器 )
  • 【hot100-java】【括号生成】