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


里面存储了

  • isa
  • superclass
  • cache
  • bits

其中的bits& FAST_DATA_MASK位运算之后,拿到class_rw_tclass_rw_t里面的ro则是class_ro_t

1.1.2 class_rw_t
  • class_rw_t里面的methodspropertiesprotocols是二维数组,是可读可写的,包含了类的初始内容分类的内容

1.1.3 class_ro_t
  • class_ro_t里面的baseMethodListbaseProtocolsivarsbaseProperties是一维数组,是只读的,包含了类的初始内容

1.2 class_rw_t和class_ro_t的区别

对于他们里面的主要内容:

  1. class_rw_tmethodspropertiesprotocols
  2. class_ro_tbaseMethodListbaseProtocolsivarsbaseProperties

区别主要是:

  • class_rw_t的主要成员是二维数组class_ro_t的主要成员是一维数组
  • class_rw_t的主要成员是可读可写的,class_ro_t是只读的

1.3 class_rw_t和class_ro_t的关系

class_rw_tclass_ro_t里面的结构很像,但是class_ro_t的成员基本上带了base

1.3.1 分析关系

其实刚开始的时候不存在rw的,class里面的东西都保存在ro里面,bits取出来的其实是rorw是后面才生成的

因为rw是可读可写的,生成的时候,会把ro里面的东西合并进去,然后把rw设置为datacls->setData(rw),此时rw就替换了原本ro的位置,同时rw把ro属性指向原来的ro对象

1.3.2 原因

class_rw_t里面的数据基本上是二维数组,并且是可读可写。

我们知道分类的东西是runtime阶段才附加进去的,在将分类的东西合并到class里面的时候。

因此他们之间是相互配合的,class_ro_t先是存储了编译期间固定的东西,运行时一些动态的东西则是存入class_rw_tclass_rw_t在初始化前会将class_ro_t的东西先附加进去。于是class_rw_t里面就有完整的东西

1.4 method_t

  • method_t是对方法\ 函数的封装

  • IMP代表函数的具体实现

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

  • types包含了函数返回值、参数编码的字符串
返回值参数1参数2参数n
1.4.1 Type Encoding

iOS中提供了一个叫做@encode的指令,可以将具体的类型表示成字符串编码

1.4.2 types

使用Xcode 12.5.1 iPhone(12.4)模拟器
@oubijiexi

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

00000基础搭建vue+flask前后端分离项目

我完全是参考的这个vue3flask前后端分离环境速建_flask vue3-CSDN博客 安装了node_js(添加了环境变量) 环境变量 把原来的镜像源换成了淘宝镜像源 npm config set registry https://registry.npmmirror.com/ 查看版本证明安装成功 npm - v 安装npm i…

web自动化测试系列-selenium的运行原理和常用方法介绍(二)

目录 1.selenium的运行原理 2.常用方法介绍 接上文 :web自动化测试系列-selenium的安装和运行(一)-CSDN博客 在上文中我们编写了一段简单的代码 ,可以驱动浏览器访问百度并搜索关键字 。这里我们再把这段代码再拿来加以说明 。 # 1. 导包 from selen…

gitee拉取与推送

🌱博客主页:青竹雾色间 😘博客制作不易欢迎各位👍点赞⭐收藏➕关注 目录 一,从本地推送项目到gitee1.首先我们在gitee上创建一个仓库2.clone远程仓库到本地3.git的三板斧3.1. add - 将代码添加到本地仓库3.2. commit …

入行AI写作第一个月收入2万+复盘分享

AI写作作为一种新兴的创作方式,正逐渐改变着内容产业的生态。在这个领域中,许多人通过自己的努力和智慧,实现了快速的成长和收入的增长。本文将从技术学习与掌握、实践与应用、内容创作与优化、持续学习与创新、总结与复盘这五个方面&#xf…

Python时间序列异常检测库之adtk使用详解

概要 ADTK(Anomaly Detection Toolkit)是一个用于时间序列异常检测的Python库。它提供了一系列工具来识别时间序列数据中的异常模式,适用于多种监测和预测任务。 ADTK简介 ADTK专注于时间序列异常检测,支持多种异常检测算法,包括统计学方法、机器学习模型以及基于规则的…

配置Web运行环境与第一个网页

安装与配置Web环境: 如下使用了VSC作为web的运行环境。 下面是VSC的官网点击进入:Download Visual Studio Code - Mac, Linux, Windowshttps://code.visualstudio.com/download 1.下载 进入官网后可以看到有windows,linux,还有苹果按照自己的系统下载&…

Halcon深度学习项目实战系统教程

Halcon在机器视觉中的价值主要体现在提供高效、可扩展、灵活的机器视觉解决方案,帮助用户解决各种复杂的机器视觉问题,提高生产效率和产品质量。 缩短产品上市时间 Halcon的灵活架构使其能够快速开发出任何类型的机器视觉应用。其全球通用的集成开发环境(HDevelop)有助于降…

CDLKF不锈钢浸入式多级离心泵

一、构造特点与工作原理 CDLKF型不锈钢浸入式多级离心泵采用了先进的设计理念,其结构紧凑,占地面积小。泵体采用优质不锈钢材料,不仅保证了良好的抗腐蚀性和耐磨性,同时也确保了泵的长期稳定运行。 该泵的核心部件是多级离心叶轮&…

数字孪生在教学培训的应用场景

数字孪生技术在教学培训领域的应用场景非常广泛,它通过创建一个真实世界的虚拟副本,为教育和培训提供了全新的方法和手段。以下是一些具体的应用场景,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司&#…

2024/3/26 C++作业

定义一个矩形类(Rectangle),包含私有成员:长(length)、宽(width), 定义成员函数: 设置长度:void set_l(int l) 设置宽度:void set_w(int w) 获取长度:int…

centos7 使用docker安装了mongo 怎么设置远程链接,必须使用密码才能连接

docker run -d –name mongodb_container -e MONGO_INITDB_ROOT_USERNAMEroot -e MONGO_INITDB_ROOT_PASSWORDroot -e MONGO_INITDB_DATABASEdataserver -p 27017:27017 \ 无法在mongo容器里编辑文件 如果你无法直接编辑 MongoDB 容器内的配置文件,你可以尝试…

Oracle中实现根据条件对数据的增删改操作——Merge Into

一、需求描述 在我们进行项目开发的过程中,会遇到这样的场景,需要根据某个条件对数据进行增、删、改的操作;遇到这种情况我们有2种方法进行解决: 方法一:①查询指定条件;②根据查询出的指定条件结果在执行…

生成 SSH 公钥

Windows 用户建议使用 Windows PowerShell 或者 Git Bash,在 命令提示符 下无 cat 和 ls 命令。 1、通过命令 ssh-keygen 生成 SSH Key: ssh-keygen -t ed25519 -C "Gitee SSH Key"-t key 类型 -C 注释 输出,如: 中间…

Redis入门三(主从复制、Redis哨兵、Redis集群、缓存更新策略、缓存穿透、缓存击穿、缓存雪崩)

文章目录 一、主从复制1.单例redis存在的问题2.主从复制是什么?3.主从复制的原理4.主从搭建1)准备工作2)方式一3)方式二 5.python中操作1)原生操作2)Django的缓存操作 二、Redis哨兵(Redis-Sent…

Redis和MySQL如何保持数据一致性?

在高并发的场景下,大量的请求直接访问MySQL很容易造成性能问题。所以,我们都会用Redis来做数据的缓存,削减对数据库的请求。但是,MySQL和Redis是两种不同的数据库,如何保证不同数据库之间数据的一致性就非常关键了。 …

Vue3 新项目默认工程文件理解

Vue3 新项目默认工程文件理解 文章目录 Vue3 新项目默认工程文件理解0、工程文件结构图1、main.ts2、index.html源文件编译后 3、App.vue4、.d.ts 文件作用 0、工程文件结构图 1、main.ts // 引入 createApp 函数 import { createApp } from vue // 引入 style.css 文件&#…

工业镜头常用参数之实效F(Fno.)和像圈

Fno. 工业镜头中常用到的参数F,有时候用F/#,Fno.来表示,指的是镜头通光能力的参数。它可用镜头焦距及入瞳直径来表示,也可通过镜头数值孔径(NA)和光学放大倍率(β)来计算。有效Fno.…

FPGA亚稳态学习总结

首先是组合逻辑电路考虑的是竞争冒险,冒险会产生毛刺。重点研究如何去毛刺 时序逻辑电路考虑的是时序不满足会产生的亚稳态问题:如何考量时序满不满足呢?根据不同的场景又有不同的说法。 时序分析的两组基本概念 建立时间与保持时间 1.在…

【Flask开发实战】安装mysql数据库与配置连接

1、安装mysql 通过yum方式安装MySQL服务器: sudo yum install mysql-server 在安装过程中,系统可能会要求确认安装。按下Y键并按回车键继续。 安装完成后,MySQL服务器应已自动启动。可以使用以下命令查看和启动MySQL服务: sudo…

Go语言介绍以及如何在Go语言中操作MySQL数据库

人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 目录 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌…
最新文章