OC消息机制

news2024/11/24 1:57:35

目录

    • 1 OC消息机制
    • 2 OC消息发送
    • 3 OC动态方法解析
    • 4 OC消息转发

1 OC消息机制

OC对象调用方法在编译阶段不知道具体的方法在哪里,是在运行的过程中,向对象发送消息,通过对象得到函数地址,调用函数,如果没有找到,则抛出异常。
OC中方法调用,其实都是转成了objc_msgSend函数的调用, 给receiver 【方法调用者】 发送了一条消息 【selector 方法名】。

objc_msgSend 底层有3大阶段:

  • OC 消息发送
  • 动态方法解析
  • 消息转发

类的数据结构: 类对象中,存储着isa, superclass , 属性、对象方法、协议、成员变量等

struct objc_class {
Class isa; //类的isa指向它的metaclass
Class superclass; //指向类的超类
cache_t cache; // 方法缓存 - 方法缓存列表,散列表(哈希表)数据结构,缓存自己之前调用过的方法,指向最近使用的方法的指针,用于提升效率
class_data_bits_t; // 获取具体的类信息
}

2 OC消息发送

如何通过对象找到调用函数的地址?
[selector 方法名]会返回一个SEL变量,这个变量是char *的形式将方法对应为唯一的值,以键值对的形式存储函数地址。类对象中的isa就是指向对象的类的指针isa。

发送过程:
1、在程序运行时会给每个类的结构体分配一块空间,对象的isa指向的就是这块空间
2、当发送调用方法的消息后,根据receiver对象的isa指针获取它对应的class
3、通过SEL查找函数,优先在class的cache查找message方法,如果找不到,再到methodLists查找,若还不能找到,再去superClass中查找,找到后会将method放到对应objc_class的cache中,方便下次查找。
4、一旦找到message这个方法,再依据receiver 中的self 指针找到当前的对象,调用当前对象的具体实现的方法(IMP),然后传递参数,调用实现方法。

在这里插入图片描述

当对象收到无法解读的消息的时候,则需要启动消息转发。

1、首先判断调用的方法对象是否为nil, 如果为nil,则直接退出,通过实例对象的isa 找到类对象,在类对象的cache 列表中查找,如果找到直接调用,
2、如果cache 列表中没有,则在这个类对象的方法列表中查找,如果找到调用,并将此方法放在自己的cache 中,方便之后查找
3、如果类对象方法列表中没有,则通过类对象的superclass 指针,找到父类的类对象, 先cache 中查找,再方法列表中查看。如果在父类中找到了方法,则调用,并将方法缓存到自己的cache中,方便之后查找。
4、如果superclass 为nil, 则进入动态方法解析阶段。

3 OC动态方法解析

1、首先会判断是否进入过动态方法解析阶段,

  • 如果进入过则直接进入下一步,消息转发
  • 如果没有进入,则会进入这个方法解析阶段,会调用 - resolveInstanceMethond; 在这个方法里面实现代码,之后将这个动态方法解析阶段标记为执行过的状态。

2、动态解析过后,会重新走消息发送的流程,如果找不到方法会再次进入resolveInstanceMethond方法,此时已经标记过了,直接进入一下个阶段:消息转发

4 OC消息转发

绘图中

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/539839.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机网络实验(ensp)-实验 9:配置 NAT 及了解 ping 命令

目录 实验报告: 实验操作 1.建立网络拓扑图并开启设备 2.配置路由器 1.输入命名:sys 从用户视图切换到系统视图 2.输入命名:sysname 姓名 修改路由器名字 3.输入命名:interface g0/0/1 (简写&…

Linux——进程和计划任务管理

个人简介:云计算网络运维专业人员,了解运维知识,掌握TCP/IP协议,每天分享网络运维知识与技能。座右铭:海不辞水,故能成其大;山不辞石,故能成其高。 个人主页:小李会科技的…

Uniapp申请APP版应用签名、打包、并在微信开放平台申请移动应用的全流程攻略

一.应用签名申请 1.1 安装jdk, jre, 并设置环境变量 Jdk下载链接 1.2 准备就绪后, 重新打开cmd窗口, 键入Java看是否已正确配置.** 1.3 如已正确配置,则执行以下命令,进行证书生成操作。生成好的证书保存在当前cmd的启动目录下** 证书别名和应用名称可替换成自己的软件名称.…

【容斥+状压+树上异或】ABC152 F - Tree and Constraints

思路真的和他很像,但是我不太会写容斥,只写过几道板子题 而且有个地方不知道怎么处理,就是容斥原理的F函数里面怎么求多个路径的边的并集 这里是用状压处理的 该学学容斥的写法了QwQ F - Tree and Constraints (atcoder.jp) 题意&#x…

Python 实验六 函数的设计

1.编写两个函数分别按单利和复利计算利息,根据本金、年利率、存款年限得到本息和和利息。调用这两个函数计算1000元在银行存3年,在年利率是6%的情况下,单利和复利分别获得的本息和和利息。单利计算指只有本金计算利息。复利计算是指不仅本金计…

【问题解决】Mybatis Plus Generator(新代码生成器)+达梦数据库,创建数据库连接失败

前言 使用Mybatis Plus Generator(新代码生成器)达梦数据库,执行生成方法失败 无法创建数据库连接 文章目录 前言问题描述错误日志输出尝试解决最终解决方法 问题描述 创建数据源配置,连接配置参照官网 jdbc:dm://localhost:5236/…

电脑照片怎么导入苹果手机?三个妙招帮你解决!

案例:电脑有很多照片,该如何导入苹果手机? 【家人们,电脑里面的照片怎么样可以快速导入到苹果手机?求方法!】 导入电脑照片到苹果手机是一个常见的需求,尤其是当您希望在手机上随时欣赏和分享这…

从桌面端到移动端,.NET MAUI为什么对WPF开发人员更简单?

.NET多平台应用程序UI(. NET MAUI)的市场吸引力与日俱增,这是微软最新的开发平台,允许开发者使用单个代码库创建跨平台应用程序。尽管很多WPF开发人员还没有跟上 .NET MAUI的潮流,但我们将在这篇文章中为大家展示他的潜…

数字信号处理基础(一)

目录 1. 写在前面2. 连续信号和离散信号2.1连续信号2.2 离散信号 3. 常用信号的产生3.1 单位脉冲序列3.2 单位阶跃序列3.3 指数函数3.4 正弦信号和余弦信号3.5 sinc函数3.6 矩形脉冲信号 4. 信号卷积5. 完整代码 1. 写在前面 为了更好的理解通信原理系列文章,在此补…

说说什么是IO多路复用?以及其演进过程。

文章目录 1.阻塞IO模型(BIO)和 非塞IO模型(NIO)2.什么是IO多路复用?3.IO多路复用的演进? 1.阻塞IO模型(BIO)和 非塞IO模型(NIO) 阻塞IO模型(BIO&…

国考省考行测:科学推理,光学,声学

国考省考行测: 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能,附带行测和申论,而常规国考省考最重要的还是申论和行测,所以大家认真准备吧,我讲一起屡屡申论和行测的重要知识点 遇到寒冬&am…

响应式UI组件库Kendo UI for Vue可轻松创建联系表单!

Kendo UI致力于新的开发,来满足不断变化的需求。Kendo UI for Vue使用旨在提高性能和丰富用户体验的Vue组件,帮助开发人员构建下一代应用程序。它是为Vue技术框架提供可用的Kendo UI组件,以便更快地构建更好的Vue应用程序。 联系表单用于在网…

CRM系统的实施要注意什么?

CRM系统的实施要注意什么? 在如今竞争激烈的商业环境中,拥有一个高效的CRM系统已经变成了企业不可或缺的一部分。 这就来讲一讲,在实施CRM过程中需要注意哪些问题。 01 CRM实施要注意哪些问题? 企业在实施CRM时,需…

虹科案例 | 激光测距仪在高温金属冶炼中的应用

Part.01 应用背景 虹科Dimetix激光测距传感器通常用于钢制热轧机,因为它们提供了一种精确的非接触式方法来确定温度过高而无法触摸的材料的位置或尺寸。苛刻的生产工艺和恶劣的环境条件通常超出了依赖于与被测材料接触的传统传感器的能力。虹科Dimetix激光器拥有良…

博客系统后端设计(五) -实现登录页面要求强制登录功能

文章目录 实现页面要求强制登录实现思路1.约定前后端交互接口2.实现后端代码3.修改前端代码 实现页面要求强制登录 当用户访问列表页/详情页/编辑页的时候,要求用户已经是登录的状态了, 如果用户还没登录,就会强制跳转到登录页面。 实现思路…

精通SpringCloud/Boot配置文件在Nacos中的配置

目录 1 什么是nacos? Nacos 地图 Nacos 生态图 2 springcloud中精通Nacos的配置中心 目录结构 日志配置文件 原始的配置文件 使用Nocas对配置文件进行拆分 引用nacos中的配置文件 共享nacos中的配置文件操作 我们使用同样的方法将日志配置提取出来 1 什么是nacos?…

微信过期视频怎么恢复?恢复视频的方法已经给你总结好了!

案例:微信视频过期,已经被清理怎么办? 【朋友之前发的视频过期了,现在怎么都找不到,有什么方法可以恢复回来吗?感谢!】 微信作为一款热门的社交应用程序,允许用户发送和接收照片、视…

搭建Freekan私人影视电影网站,cpolar内网穿透发布上线

文章目录 1.前言2.本地网页搭建2.1 环境使用2.2 支持组件和环境设置2.3 支持组件选和环境设置2.4 网页安装2.5 测试和使用2.6 问题解决 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 转发自CSDNprobezy的文章:使用Cpolarfreekan源码…

MATLAB绘制动画(五)GIF

GIF这个文件大家就比较熟悉了,我们通常当做表情包的动图一般都是用GIF格式。 这是因为GIF格式的文件比较小,传输速度快。 用MATLAB生成GIF图像同样需要将图像保存下来,通过循环展示动画 代码如下: clc; clear; close all; set…

SpringCloud(27. Redis 和 ZK 分布式锁)

上一篇 :26.分布式服务框架Dubbo面试题简析 1. redis 分布式锁 官方叫做 RedLock 算法,是 redis 官方支持的分布式锁算法。这个分布式锁有 3 个重要的考量点: 互斥(只能有一个客户端获取锁)不能死锁容错(…