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…...
CANN-昇腾NPU-多机多卡-怎么把16卡用出32卡的效果
16 张 Atlas 800I A2 的理论算力是 16 310 4960 TFLOPS(fp16)。但实际训练 Llama2-7B 只用到了 3200 TFLOPS——利用率 64%。这篇讲怎么把利用率从 64% 提到 85%,等效 16 卡用出 25 卡的效果。 利用率低的原因 理论算力: 16 310 4960 TFL…...
【行业首发】Midjourney v6.2水动力学渲染白皮书:基于流体物理模型的prompt工程重构(附NASA水波频谱对照表)
更多请点击: https://codechina.net 第一章:【行业首发】Midjourney v6.2水动力学渲染白皮书:基于流体物理模型的prompt工程重构(附NASA水波频谱对照表) Midjourney v6.2首次引入隐式流体物理引擎(Implici…...
多卡训练加速:HCCL 集合通信实战
前言 单卡训练慢,多卡又踩坑——梯度同步怎么配、拓扑怎么选、带宽怎么压满,这些细节决定分布式训练能不能真正提速。 HCCL(Huawei Collective Communication Library)是昇腾的多卡通信库,对标 NVIDIA 的 NCCL。它封装…...
人机协作新范式:高效论文写作全流程AI论文平台推荐(2026 最新)
2026年AI论文平台持续升级,论文写作全流程可拆解为文献调研→选题/开题→大纲/初稿→文献综述→降重/去AI味→润色/格式→查重/投稿七大环节,以下工具按环节精准匹配,兼顾中文适配、降重能力、去AI痕迹、学术合规四大核心需求,覆盖…...
Unity中Spine动画高效集成的四大关键断层
1. 为什么Spine不是“换个插件就完事”的动画方案?在Unity 2D项目里,当美术开始交付第一版Spine动画资源时,很多团队会下意识地把它当成“比SpriteRenderer高级一点的图片播放器”——拖进场景、挂个SpineAnimation组件、调个AnimationName&a…...
戴森球计划工厂蓝图:革命性工厂配置架构的5大技术突破
戴森球计划工厂蓝图:革命性工厂配置架构的5大技术突破 【免费下载链接】FactoryBluePrints 游戏戴森球计划的**工厂**蓝图仓库 项目地址: https://gitcode.com/GitHub_Trending/fa/FactoryBluePrints FactoryBluePrints蓝图仓库代表了戴森球计划游戏中最先进…...
C++ std::function:类型擦除与万能函数包装器实战指南
1. 项目概述:为什么我们需要 std::function 在C的世界里,函数指针曾经是回调、事件处理和策略模式等场景的绝对主力。但用过的人都知道,那玩意儿用起来有多别扭:类型声明复杂,对非静态成员函数、lambda表达式、函数对…...
SAP ABAP实战:用cl_md_bp_maintain批量维护客户BP,附完整代码与字段拆分逻辑
SAP ABAP实战:基于cl_md_bp_maintain的客户主数据批量处理框架 在SAP系统集成项目中,客户主数据的批量创建与更新是高频需求场景。当需要对接电商平台、CRM系统或进行历史数据迁移时,传统单条处理方式效率低下且难以保证数据一致性。本文将深…...
Docker编译镜像实战:为嵌入式Linux开发打造标准化环境
1. 项目概述:为什么我们需要一个专属的Docker编译镜像?如果你是一名嵌入式Linux开发者,或者正在学习诸如全志Tina Linux这样的开源嵌入式系统,那么“编译环境”这个词对你来说一定不陌生。它就像是一个厨师的后厨,锅碗…...
别再让FFT精度拖后腿了!手把手教你用三点插值法把频率估计误差降到最低
别再让FFT精度拖后腿了!手把手教你用三点插值法把频率估计误差降到最低 在音频调谐器里校准乐器音高时,工程师发现440Hz的标准音高在1024点FFT中总是显示为439.2Hz;5G基站接收端解调时,载波频率的微小偏移导致误码率飙升ÿ…...
