iOS - Runtime - Class的结构
文章目录
- iOS - Runtime - Class的结构
- 前言
- 1. Class的结构
- 1.1 Class的结构
- 1.1.1 objc_class
- 1.1.2 class_rw_t
- 1.1.3 class_ro_t
- 1.2 class_rw_t和class_ro_t的区别
- 1.3 class_rw_t和class_ro_t的关系
- 1.3.1 分析关系
- 1.3.2 原因
- 1.4 method_t
- 1.4.1 Type Encoding
- 1.4.2 types
iOS - Runtime - Class的结构
前言
1. Class的结构
前面我们学习OC对象的时候,了解了class类对象、meta-class元类对象

实际上,class类对象、meta-class元类对象底层结构体都是class,元类对象可以认为是特殊的类对象。他们底层结构是一样的,只不过存储的内容有所区别
1.1 Class的结构
Class的结构如下图所示:

1.1.1 objc_class

里面存储了
isasuperclasscachebits
其中的bits,& FAST_DATA_MASK位运算之后,拿到class_rw_t,class_rw_t里面的ro则是class_ro_t
1.1.2 class_rw_t
class_rw_t里面的methods、properties、protocols是二维数组,是可读可写的,包含了类的初始内容、分类的内容

1.1.3 class_ro_t
class_ro_t里面的baseMethodList、baseProtocols、ivars、baseProperties是一维数组,是只读的,包含了类的初始内容

1.2 class_rw_t和class_ro_t的区别
对于他们里面的主要内容:
class_rw_t:methods、properties、protocolsclass_ro_t:baseMethodList、baseProtocols、ivars、baseProperties
区别主要是:
class_rw_t的主要成员是二维数组,class_ro_t的主要成员是一维数组class_rw_t的主要成员是可读可写的,class_ro_t是只读的
1.3 class_rw_t和class_ro_t的关系
class_rw_t和class_ro_t里面的结构很像,但是class_ro_t的成员基本上带了base。
1.3.1 分析关系
其实刚开始的时候不存在rw的,class里面的东西都保存在ro里面,bits取出来的其实是ro,rw是后面才生成的
因为rw是可读可写的,生成的时候,会把ro里面的东西合并进去,然后把rw设置为datacls->setData(rw),此时rw就替换了原本ro的位置,同时rw把ro属性指向原来的ro对象
1.3.2 原因
class_rw_t里面的数据基本上是二维数组,并且是可读可写。
我们知道分类的东西是runtime阶段才附加进去的,在将分类的东西合并到class里面的时候。
因此他们之间是相互配合的,class_ro_t先是存储了编译期间固定的东西,运行时一些动态的东西则是存入class_rw_t,class_rw_t在初始化前会将class_ro_t的东西先附加进去。于是class_rw_t里面就有完整的东西
1.4 method_t
method_t是对方法\函数的封装

IMP代表函数的具体实现

SEL代表方法\函数名,一般叫做选择器,底层结构跟char *类似- 可以通过
@selector()和sel_registerName()获得 - 可以通过
sel_getName()和NSStringFromSelector()转成字符串 不同类中相同名字的方法,所对应的方法选择器是相同的
- 可以通过

- types包含了函数返回值、参数编码的字符串
| 返回值 | 参数1 | 参数2 | … | 参数n |
|---|
1.4.1 Type Encoding
iOS中提供了一个叫做@encode的指令,可以将具体的类型表示成字符串编码


1.4.2 types

使用Xcode 12.5.1 iPhone(12.4)模拟器
@oubijiexi
相关文章:
iOS - Runtime - Class的结构
文章目录 iOS - Runtime - Class的结构前言1. Class的结构1.1 Class的结构1.1.1 objc_class1.1.2 class_rw_t1.1.3 class_ro_t 1.2 class_rw_t和class_ro_t的区别1.3 class_rw_t和class_ro_t的关系1.3.1 分析关系1.3.2 原因 1.4 method_t1.4.1 Type Encoding1.4.2 types iOS - …...
MySQL高阶语句(一)
一、常用查询 (增、删、改、查) 对 MySQL 数据库的查询,除了基本的查询外,有时候需要对查询的结果集进行处理。 例如只取 10 条数据、对查询结果进行排序或分组等等 1、按关键字排序 PS:类比于windows 任务管理器 使用 SELECT 语…...
MySQL知识总结
一条 SQL 语句过来的流程是什么样的? ①当客户端连接到 MySQL 服务器时,服务器对其进行认证。可以通过用户名与密码认证,也可以通过 SSL 证书进行认证。登录认证后,服务器还会验证客户端是否有执行某个查询的操作权限。 ②在正式…...
Go-Gin-Example 第八部分 优化配置接口+图片上传功能
文章目录 前情提要本节目标 优化配置结构讲解落实修改配置文件优化配置读取及设置初始化顺序第一步 验证 抽离file 实现上传图片接口图片名加密封装image的处理逻辑编写上传图片的业务逻辑增加图片上传的路由 验证实现前端访问 http.FileServerr.StaticFS修改文章接口新增、更新…...
阿里云国际DDoS高防的定制场景策略
DDoS高防的定制场景策略允许您在特定的业务突增时段(例如新业务上线、双11大促销等)选择应用独立于通用防护策略的定制防护策略模板,保证适应业务需求的防护效果。您可以根据需要设置定制场景策略。 背景信息 定制场景策略提供基于业务场景…...
v4l2采集视频
Video4Linux2(v4l2)是用于Linux系统的视频设备驱动框架,它允许用户空间应用程序直接与视频设备(如摄像头、视频采集卡等)进行交互。 linux系统下一切皆文件,对视频设备的操作就像对文件的操作一样ÿ…...
Spring Cloud 八:微服务架构中的数据管理
Spring Cloud 一:Spring Cloud 简介 Spring Cloud 二:核心组件解析 Spring Cloud 三:API网关深入探索与实战应用 Spring Cloud 四:微服务治理与安全 Spring Cloud 五:Spring Cloud与持续集成/持续部署(CI/C…...
Chrome/Edge 使用 Markdown Viewer 查看 Markdown 格式文件
Chrome/Edge 使用 Markdown Viewer 查看 Markdown 格式文件 0. 引言1. 安装 Markdown Viewer 插件2. 使用 Markdown Viewer 阅读 Markdown 格式文件 0. 引言 大部分程序员都喜欢 Markdown 格式的文件,这时给一些没有在电脑上安装 Markdown 编辑器的同事分享资料时&…...
flutter 弹窗之系列一
自定义不受Navigator影响的弹窗 class MyHomePage extends StatefulWidget {const MyHomePage({super.key, required this.title});final String title;overrideState<MyHomePage> createState() > _MyHomePageState(); }class _MyHomePageState extends State<MyH…...
【Flink实战】Flink hint更灵活、更细粒度的设置Flink sql行为与简化hive连接器参数设置
文章目录 一. create table hints1. 语法2. 示例3. 注意 二. 实战:简化hive连接器参数设置三. select hints(ing) SQL 提示(SQL Hints)是和 SQL 语句一起使用来改变执行计划的。本章介绍如何使用 SQL 提示来实现各种干预。 SQL 提示一般可以…...
【python从入门到精通】-- 第二战:注释和有关量的解释
🌈 个人主页:白子寰 🔥 分类专栏:python从入门到精通,魔法指针,进阶C,C语言,C语言题集,C语言实现游戏👈 希望得到您的订阅和支持~ 💡 坚持创作博文…...
【手写AI代码目录】准备发布的教程
文章目录 1. tensorboard2. F.cross_entropy(input_tensor, target) F.log_softmax() F.nll_loss() 1. tensorboard from torch.utils.tensorboard import SummaryWriter# TensorBoard writer SummaryWriter(runs/mnist_experiment_1) ...if i % 100 99: # 每 100 个 b…...
2024.3.9|第十五届蓝桥杯模拟赛(第三期)
2024.3.9|十五届蓝桥杯模拟赛(第三期) 第一题 第二题 第三题 第四题 第五题 第六题 第七题 第八题 第九题 第十题 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C学习笔记,常言道,不积跬步无以至千里&…...
搭建PHP本地开发环境:看这一篇就够了
什么是PHP本地开发环境 PHP本地开发环境是指在个人计算机上模拟的服务器环境,这使得开发者能够在没有网络连接的情况下也能开发、测试和调试PHP应用程序。就像在你的电脑里装个小“服务器”,即使没网也能搞定PHP程序的开发和修修补补。这就是PHP本地开发…...
[蓝桥杯 2015]机器人数目
机器人数目 题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 少年宫新近邮购了小机器人配件,共有3类。 A 类含有:8个轮子,1个传感器; B 类含有: 6个轮子࿰…...
Codeforces Round 935 (Div. 3)
A. Setting up Camp(模拟) #include<iostream> #include<algorithm> using namespace std; const int N 2e5 10;int main(){int t, n;scanf("%d", &t);int a, b, c;while(t--){scanf("%d%d%d", &a, &b, …...
自然语言处理下载nltk模块库
nltk安装 目录 nltk安装 1.官方下载 2.离线下载 2.1 下载nltk资料包 2.2 解压下载的资料包重命名 2.2.1 将解压后的packages文件夹重命名为nltk_data 2.2.2 查看将重命名的文件夹放在那个位置 2.2.3 将上述nltk_data 文件夹放在 2.2.2 打印的位置处 3.验证是否下载成…...
题解:CF1937B(Binary Path)
题解:CF1937B(Binary Path) 一、 理解题意 1. 题目链接 CodeForces; 洛谷。 2. 题目翻译 给定一个 由 0 0 0 和 1 1 1 组成的 2 2 2 行 n n n 列的网格上寻找一条路径,使得这条路径上所有的数串联起来形成的0…...
JS——9大陷阱
一、警惕A>X>B写法 3>2>1 返回值为false(原因:3>2为true,会默认转成数字1,1>1为false) 1<4<3 返回值为true(原因:1<4为true,会默认转成数字1ÿ…...
USB - 通过configfs配置Linux USB Gadget
Linux USB gadget configured through configfs Overview USB Linux 小工具是一种具有 UDC(USB 设备控制器)的设备,可连接到 USB 主机,以扩展其附加功能,如串行端口或大容量存储功能。 A USB Linux Gadget is a device…...
重装系统后的环境快速恢复:包含BERT模型部署的自动化脚本
重装系统后的环境快速恢复:包含BERT模型部署的自动化脚本 重装系统,对开发者来说,就像一场“数字大扫除”。清爽是清爽了,但看着空空如也的终端和待部署的一长串服务列表,那种从头再来的疲惫感瞬间涌上心头。尤其是当…...
从羊肠小道到智能高速:HTTP1到HTTP3的演进之路
引言 计算机网络就像一张遍布全球的道路系统,服务器是一座座城市、村庄,客户端是穿梭其中的车辆,而HTTP协议,就是规范车辆通行、货物传递的交通规则。从HTTP1到HTTP3的演进,本质上就是这条“网络道路”的升级史——从泥…...
新手福音:用快马平台将vmware官网概念转化为可交互的虚拟机演示代码
作为一名刚接触虚拟化技术的新手,我最近在VMware官网上看到了关于虚拟机的基础概念介绍。虽然理论知识很全面,但总觉得少了点动手实践的环节。直到发现了InsCode(快马)平台,它让我能够把抽象的概念快速转化为可运行的代码,这种学习…...
突破网盘限制:高效下载的终极解决方案——网盘直链下载助手完全指南
突破网盘限制:高效下载的终极解决方案——网盘直链下载助手完全指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移…...
为什么92%的FastAPI流式AI项目在高并发下崩溃?深度解析event loop争用、response.body迭代器生命周期与uvicorn worker模型冲突
第一章:FastAPI 2.0流式AI响应的高并发失效现象全景透视当FastAPI 2.0被用于承载大语言模型(LLM)的SSE(Server-Sent Events)或分块Transfer-Encoding: chunked流式响应时,大量并发请求下常出现连接提前终止…...
DeepSeek-V3.2量化新标杆:w8a8精度突破86%!
DeepSeek-V3.2量化新标杆:w8a8精度突破86%! 【免费下载链接】DeepSeek-V3.2-w8a8-mtp-QuaRot 项目地址: https://ai.gitcode.com/Eco-Tech/DeepSeek-V3.2-w8a8-mtp-QuaRot 导语:DeepSeek-V3.2推出w8a8量化版本,采用创新Qu…...
DRM驱动(三)之核心模块回调函数解析
1. DRM驱动回调函数的核心作用 如果你曾经在Linux系统下开发过显示驱动,一定会对DRM(Direct Rendering Manager)框架不陌生。作为现代Linux显示系统的核心,DRM框架通过一系列精心设计的回调函数,让硬件厂商能够灵活地适…...
AWPortrait-Z WebUI日志诊断指南:从webui_startup.log定位90%常见问题
AWPortrait-Z WebUI日志诊断指南:从webui_startup.log定位90%常见问题 1. 引言:为什么需要关注启动日志 当你启动AWPortrait-Z WebUI时,系统会自动生成一个名为webui_startup.log的日志文件。这个文件就像是系统的"健康检查报告"…...
别再只会下载安装包了!手把手教你从源码编译最新版kkFileView(附避坑指南)
从源码构建kkFileView:解锁定制化文件预览的完整指南 在当今数字化办公环境中,文件预览功能已成为各类系统的标配需求。虽然官方提供的预编译安装包能够快速部署,但对于追求最新特性、需要深度定制或有私有化部署需求的技术团队而言ÿ…...
现在不升级Polars 2.0清洗栈,你的ETL将在Q3面临300%延迟增长——基于AWS Graviton+Arrow 15.0实测基准报告
第一章:Polars 2.0清洗栈升级的必要性与Q3延迟危机预警Polars 2.0 的清洗栈重构并非功能叠加式演进,而是面向真实数据工程场景的范式重置。随着企业级ETL流水线中非结构化日志、嵌套JSON、时序传感器数据占比突破68%,旧版基于LazyFrame单通道…...
