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

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.lryc.cn/news/325994.html

相关文章:

  • MySQL高阶语句(一)
  • MySQL知识总结
  • Go-Gin-Example 第八部分 优化配置接口+图片上传功能
  • 阿里云国际DDoS高防的定制场景策略
  • v4l2采集视频
  • Spring Cloud 八:微服务架构中的数据管理
  • Chrome/Edge 使用 Markdown Viewer 查看 Markdown 格式文件
  • flutter 弹窗之系列一
  • 【Flink实战】Flink hint更灵活、更细粒度的设置Flink sql行为与简化hive连接器参数设置
  • 【python从入门到精通】-- 第二战:注释和有关量的解释
  • 【手写AI代码目录】准备发布的教程
  • 2024.3.9|第十五届蓝桥杯模拟赛(第三期)
  • 搭建PHP本地开发环境:看这一篇就够了
  • [蓝桥杯 2015]机器人数目
  • Codeforces Round 935 (Div. 3)
  • 自然语言处理下载nltk模块库
  • 题解:CF1937B(Binary Path)
  • JS——9大陷阱
  • USB - 通过configfs配置Linux USB Gadget
  • 迷宫与陷阱(蓝桥杯)
  • Temple of Doom靶场nodejs获取shellss-manager漏洞tcpdump提权
  • day03_mysql_课后练习 - 参考答案
  • creator-webview与Android交互
  • 22.WEB渗透测试-BurpSuite(一)
  • 前端性能优化:防抖与节流
  • Copilot 编程助手的介绍及使用
  • 数据库专题(oracle基础和进阶)
  • web蓝桥杯2022省赛真题:水果拼盘
  • Web核心
  • iOS应用审核问题解决方案及优化方法 ✨