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

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.kler.cn/a/320388.html

相关文章:

  • 【JavaEE初阶 — 多线程】定时器的应用及模拟实现
  • 【DQ Robotics】基于SVD的全秩矩阵逆
  • 本草智控:中药实验管理的智能时代
  • 前端:HTML (学习笔记)【1】
  • 树莓派镜像 DIY 制作
  • [ 网络安全介绍 3 ] 网络安全事件相关案例有哪些?
  • 三光吊舱详解!
  • IT技术之电脑黑屏处理
  • 183天打造行业新标杆!BOE(京东方)国内首条第8.6代AMOLED生产线提前全面封顶
  • Java-多线程-锁
  • vue props 接收函数 function
  • 在模板字符串中不能使用element-ui组件
  • 【机器学习】ROC曲线
  • AtCoder Beginner Contest 372
  • 抓机遇,促发展——2025第十二届广州国际汽车零部件加工技术及汽车模具展览会
  • MySQL的基础用法一
  • 【论文阅读】视觉里程计攻击
  • 【机器学习】Zygote.jl
  • ollydbg 小记
  • 每天一道面试题(17):服务网格学习笔记
  • 社区团购的创新与变革——融合开源链动 2+1 模式、AI 智能名片及 S2B2C 商城小程序
  • 2024一线大厂网络安全面试题+答案,看完offe拿到手软!
  • .NET 反序列化加载哥斯拉内存马的工具
  • 计算机毕业设计 基于Python医院预约挂号系统 Django+Vue 前后端分离 附源码 讲解 文档
  • 大语言模型之LlaMA系列- LlaMA 2及LLaMA2_chat(上)
  • 【OSS安全最佳实践】对OSS表格文件中的敏感数据进行脱敏